2014-01-20 5 views
0

클래스가 인터페이스를 구현할 때 우리가해야 할 일은 그 인터페이스를 조롱하는 것뿐입니다.조롱 된 객체 전이 종속성 무시

그러나 클래스가 인터페이스를 구현하지 않는 경우가 있습니다.이 경우 클래스를 모의 객체에 바인딩하면 guice가 조롱 된 객체 종속성을 얻습니다. 를 정의하지 않고이를 방지 할 수있는 방법이 있나요 내가 B의 종속성을 상관 없어,이 시나리오에서는

class A { 
    @Inject B; 
} 

class B{ 
    @Inject C;  
} 

bind(a.class).toInstance(mock(B.class)); 

,하지만 guice 스틸은

B.

내부에 C를 주입하려고 :

는 명확히하기 위해 인터페이스?

답변

1

우선 강력하게은 단위 테스트에서 의존성 주입을 사용하지 않는 것이 좋습니다. 단일 클래스를 단원 단위로 테스트 할 때는 생성자를 만들어 생성자를 통해 직접 종속성을 전달해야합니다. 그러면 이러한 문제가 발생하지 않습니다.

통합 테스트를 작성할 때 또 다른 이야기입니다. 문제에 대한 해결책은 여러 가지가 있습니다.

  1. 모든 클래스가 주 사용 가능 생성자를 통해서만 종속성을 갖도록하십시오. 이 방법으로 Guice는 객체가 Mockito에 의해 만들어지기 때문에 아무 것도 주입하지 않습니다.

  2. 제공자를 사용하십시오 (필요한 경우 범위 지정). 다음은 B로 당신의 시도 산세 주입에 해당합니다 (난 당신이 정말 bind(B.class).toInstance(mock(B.class))를 의미한다고 가정

    bind(B.class).toProvider(new Provider<B> { 
        @Override 
        public B get() { 
         return mock(B.class); 
        } 
    }).in(Singleton.class); 
    

당신은 당신의 요구를 충족하기 위해 범위를 조정할해야

+0

공급자 내가 찾고 있었던 정확하게 것입니다. 에 대한. – Axxiss

0

부분적으로 이것을 해결하기 위해 Mockito를 사용하는 것은 매우 쉽습니다.

당신이

ATest{ 
    @Mock B; 
    @InjectMocks A; 

    public void setUp(){ 
     MockitoAnnotations.initMocks(this); 
    } 
} 

처럼 Mockito 대신 guice의 분사를 할 것입니다이 방법을 @Mock@InjectMocks 주석을 사용할 필요가 성공적으로 모의를 주입하는 restrictions의 몇 가지 있습니다.

코드가 클래스에 대한 의존성이 강해지기만하면됩니다.

A 내부에는 C와 같은 것이 있습니다. obj = new C(); 그리고 C는 필드를 주입했습니다.

관련 문제