2017-03-27 1 views
3

아래 클래스 설정이 있습니다.스프링 : 필드 및 생성자 삽입이 모두있는 클래스에 대한 단위 테스트

class Base { 
    @Autowired 
    private BaseService service; //No getters & setters 
    .... 
} 

@Component 
class Child extends Base { 
    private final SomeOtherService otherService; 

    @Autowired 
    Child(SomeOtherService otherService) { 
    this.otherService = otherService; 
    } 
} 

나는 Child 클래스의 단위 테스트를 쓰고 있습니다. @InjectMocks을 사용하면 otherService이 null로 나타납니다. 내가 사용하는 경우 Child 클래스의 생성자를 테스트 할 때 Base 클래스의 필드는 null이됩니다.

필드 주입에 대한 모든 논점을 알고 있습니다. 그러나 BaseChild 클래스가 속성을 삽입하는 방식을 변경하지 않고이를 해결할 방법이 있는지 알고 싶습니다.

감사합니다.

+0

예, 주사를 수행하기 위해 Spring을 사용하지 마십시오. mock을 생성하고 원하는대로 테스트 설정에 삽입하십시오. – duffymo

+0

자세히 설명해 주시겠습니까? mock을 만들 수는 있지만 그것을 삽입 할 수는 없습니다. '@ InjectMocks'를 사용하여 모의 객체를 삽입하면 생성자 삽입을 사용하기 때문에'Child' 클래스의 속성은'null'입니다. 테스트에서'Base' 클래스의 속성을 전달할 방법이 없기 때문에 생성자를 사용하여 테스트중인 클래스를 초기화 할 수 없습니다. – Mubin

+0

테스트 케이스를 포함하십시오. –

답변

3

그냥 이렇게 :

public class Test { 
    // Create a mock early on, so we can use it for the constructor: 
    OtherService otherService = Mockito.mock(OtherService.class); 

    // A mock for base service, mockito can create this: 
    @Mock BaseService baseService; 

    // Create the Child class ourselves with the mock, and 
    // the combination of @InjectMocks and @Spy tells mockito to 
    // inject the result, but not create it itself. 
    @InjectMocks @Spy Child child = new Child(otherService); 

    @Before 
    public void before() { 
     MockitoAnnotations.initMocks(this); 
    } 
} 

Mockito는 옳은 일을해야한다.

+0

'@InjectMocks와 @Spy의 조합은 mockito에게 결과를 주입하도록 알려주지 만 자체적으로 생성하지는 않습니다. '- 이것은 열쇠였습니다. 엄청 고마워!! – Mubin

관련 문제