2016-09-05 2 views
0

2 서비스를 사용하는 ClassA을 테스트하려고합니다. 하나의 서비스는 autowired가되어야하고 하나는 조롱 된 객체로 취급되어야합니다. 불행하게도 조롱 객체 내 테스트 클래스에 Autowiring 나머지 종속성 동안 @InjectMocks 작동하지 않습니다

를 주입하지

입니다. 모든 필드는 스프링 자동 배선 기능을 사용하여 설정하는 것처럼 동작합니다. 테스트 된 ClassA는 다른 추상 클래스를 상속합니다. autowiring이 사용되지 않으면, 조롱 된 객체는 성공적으로 전달됩니다. 불행히도 나는 ServiceDao를 조롱 할 수 없다. 왜 @InjectMocks@Autowiring 주석을 결합하려고하는지.

클래스 A.

public ClassA extends AbstractClassA<ClassOne, ClassTwo>{ 

    @Autowired 
    protected ServiceOne serviceOne;  //this services needs to be mocked 

    @Override 
    protected List<ClassTwo> testedMethod(){ 
     return serviceOne.getList();  //here method is not returning mocked objects 
    }         //as it supposed to do. 
    ........ 
} 

AbstractClass

public class AbstractClassA<T1 extends InterfaceOne, T2 extends InterfaceTwo){ 
    @Autowired 
    protected ServiceDAO serviceDAO; //this services needs to be autowired 

    protected abstract List<T2> testedMethod(); 

} 

의 TestClass. 이 경우

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath*:testApplicationContext.xml"}) 
public class Test { 
    @Mock 
    private ServiceOne serviceOne; //this mock object and it's return 
            //objects are set properly 


    @Autowired 
    @InjectMocks 
    private ClassA classA; //all fields are autowired, including the services that should be mocked 

    @Before 
    public void setData(){ 
     Mockito.Annotations.initMocks(this); 
     List<ClassTwo> result = Arrays.asList(new ClassA()); 
     when(serviceOne.testedMethod().thenReturn(result); //here when i invoke mocked object it is returning correct list. 
    } 
} 
+0

나는 다른 주입 시스템을 혼합하려고하지 않을 것이다. 대신 간단히 mocked bean을 만들고 Spring을 통해 주입하도록 Spring을 설정하십시오. –

+0

u는 조롱 된 콩을 만드는 것에 대해 무슨 뜻입니까? 메서드가 호출 될 때 스프링 브랜이 sth를 반환하도록 어떻게 알 수 있습니까? – Dago

+0

XML 설정, JavaConfig 등 무엇을 사용하고 있느냐에 달려 있습니다. 그러나 모든 경우에 Mockito (예 :)를 사용하여 모의 인 Bean을 만드는 테스트 구성을 만들 수 있습니다. 그런 다음 빈 자체를 테스트에 삽입하고 수행 할 작업을 지시 할 수 있습니다. –

답변

1

당신의 봄 테스트 환경 구성을 통해 주입 된 콩을 조롱 아마 가장 좋습니다. 그렇게 쉽게 할 수 없다면, Spring ReflectionTestUtils 클래스를 사용하여 서비스의 개별 객체를 조롱 할 수 있습니다.

<bean id="serviceOne" class="org.mockito.Mockito" factory-method="mock"/> 
    <constructor-arg value="com.package.ServiceOne"/> 
</bean> 

자바 측에서 : 테스트 구성 XML 파일에서

당신이 조롱 콩 정의 할 수 있습니다 테스트 케이스 당신이 할 수있는 @Autowire ServiceOne serviceOne에서

@Bean 
public ServiceOne serviceOne() { 
    return mock(ServiceOne.class); 
} 

을 사용할 당신의 모의 객체로 :

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath*:testApplicationContext.xml"}) 
public class Test { 
    @Autowired 
    private ServiceOne serviceOne; 

    @Autowired 
    private ClassA classA; 

    @Before 
    public void setData(){ 
     Mockito.Annotations.initMocks(this); 
     List<ClassTwo> result = Arrays.asList(new ClassA()); 
     when(serviceOne.testedMethod()).thenReturn(result); 
    } 
} 
+0

괜찮지 만 어디에서 testsMethod() 객체를 반환 할 수 있습니까? – Dago

+0

제안 된 테스트 클래스 – Xantier

+0

을 포함 할 답변을 수정했습니다. 불행히도 XML에서 선언 된 (mockedBean)과 Test 클래스에서의 사용법 사이에 상관 관계가 표시되지 않습니다. – Dago

관련 문제