2016-09-05 32 views
0

我想測試使用2個服務的ClassA。一個服務需要自動裝配,一個服務需要被視爲模擬對象。不幸的是嘲笑的對象是@InjectMocks不工作,而自動裝配其餘的依賴關係

沒有注入

我的測試類。所有字段的行爲都像我只使用spring autowiring feauture來設置它。測試過的ClassA也是從其他抽象類繼承而來的。如果不使用自動裝配,則模擬對象會成功傳遞。不幸的是,我不能嘲笑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. 
    ........ 
} 

抽象類

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

我不會嘗試混合不同的注射系統。相反,只需配置你的Spring來創建一個模擬bean並通過Spring注入。 –

+0

你能解釋一下你對創建嘲笑豆有什麼意義嗎?如何告訴spring brean在調用方法時返回? – Dago

+0

取決於您使用的是什麼,XML配置,JavaConfig等。但是在任何情況下,您都可以創建一個簡單地利用Mockito(例如)創建一個模擬bean的測試配置。然後你可以將這個bean本身注入到你的測試中,並告訴它該做什麼。 –

回答

1

在這種情況下,它可能是最好通過您的Spring測試上下文配置嘲笑注入豆。如果您無法輕鬆完成此操作,則可以使用Springs ReflectionTestUtils類來模擬服務中的單個對象。

在您的測試配置XML文件,您可以定義一個嘲笑豆:

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

在Java方面:

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

在您的測試情況下,你可以@Autowire ServiceOne serviceOne並使用它作爲你的模仿對象:

@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

好的,但我可以在哪裏指定testedMethod()返回對象? – Dago

+0

我修改了答案,以包含建議的測試類 – Xantier

+0

不幸的是,我看不到在XML中聲明的(mockedBean)與它在Test類中的使用之間的關聯。 – Dago