所以我有一个简单的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(...);
}
ClassB:
@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();
}
问题是类b没有为类a注入。
然后通过classA调用returnbject (ClassB),它返回NullPointerException(ClassB没有被模拟/注入)。
如果returnbject (classB)是通过IWantToTestThisClass调用的,它是可以的。
是否可以同时为两个类注入ClassB ?我想调用真正的方法,而不是模拟的方法。
将mock注入IWantToTestThisClass,而不是ClassA。所以没有对类a的模拟,B也没有被注入。
尝试在classA之前添加@InjectMocks
或者你可以这样做:
ClassB mB = Mockito.mock(ClassB.class);
classA.setClassB(mB);
如果你添加setter setClassB(…)到ClassA
@Autowired可以用constructor inject代替。所以,你的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);
}