Mockito:被注入的模拟类,没有为其他类注入



所以我有一个简单的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);
}

相关内容

  • 没有找到相关文章

最新更新