[英]Mockito: injected mock class not injected for other classes
所以我有一個簡單的java類:
@Component
public class IWantToTestThisClass {
@Autowired
private ClassA classA;
@Autowired
private ClassB classB;
public ObjectA doIt(...) {
classB.returnObject();
}
ClassA包含:
@Component
public class ClassA {
@Autowired
private ClassB classB;
public ObjectA doIt() {
classB.returnObject(...);
}
B類:
@Component
public class ClassB {
public ObjectA returnObject(...) {
...
}
我的測試設置如下:
@InjectMocks
private IWantToTestThisClass iWantToTestThisClass;
@Mock
private ClassA classA;
@Mock
private ClassB classB;
@Before
public void setUp() {
initMocks(this);
when(classA.doSmt()).thenCallRealMethod();
when(classB.doSmt()).thenCallRealMethod();
}
問題是沒有為ClassA注入ClassB。
然后,通過classA調用returnObject(ClassB),它返回NullPointerException(未模擬/注入ClassB)。
如果通過IWantToTestThisClass調用returnObject(classB)可以。
是否可以同時為兩個類注入ClassB? 我想調用真實方法,而不是模擬方法。
您正在將模擬注入IWantToTestThisClass,而不是ClassA。 因此,沒有對ClassA的模擬,也沒有在其中注入B。
嘗試在classA之前添加@InjectMocks
或者您可以:
ClassB mB = Mockito.mock(ClassB.class);
classA.setClassB(mB);
如果將setter setClassB(...)添加到ClassA
可以將@Autowired替換為構造函數注入。 因此,您的classA將是:
@Component
public class ClassA {
private static ClassB classB;
public ClassA(ClassB classB){
this.classB=classB;
}
public ObjectA doIt() {
classB.returnObject(...);
}
}
這樣,您可以稍后在@Before setUp方法中注入classB模擬:
@Before
public void setUp() {
initMocks(this);
when(classA.doSmt()).thenCallRealMethod();
when(classB.doSmt()).thenCallRealMethod();
classB = new classB(classA);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.