我想測試使用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.
}
}
我不會嘗試混合不同的注射系統。相反,只需配置你的Spring來創建一個模擬bean並通過Spring注入。 –
你能解釋一下你對創建嘲笑豆有什麼意義嗎?如何告訴spring brean在調用方法時返回? – Dago
取決於您使用的是什麼,XML配置,JavaConfig等。但是在任何情況下,您都可以創建一個簡單地利用Mockito(例如)創建一個模擬bean的測試配置。然後你可以將這個bean本身注入到你的測試中,並告訴它該做什麼。 –