我正在尝试使用 Mockito 和 JUnit 测试以下类:
public class A {
private SomeClass someObject;
private SomeImpClass someImpObject1;
private SomeImpClass2 someImpObject2;
public A(SomeImpClass someImpObject1, SomeImpClass2 someImpObject2){
someObject = makeNewObject(someImpObject1, someImpObject2);
}
public makeNewObject(SomeImpClass1 someImpObject1, SomeImpClass2 someImpObject2){
return new SomeObject(someImpObject1,someImpObject2);
}
public usingSomeObject(){
someObject.doSomething();
}
}
所以,我使用 Mockito 和 JUnit 编写了一个单元测试:
@RunWith(MockitoJUnitRunner.class)
public class ATest {
@Mock
SomeImpClass1 someImpObject1;
@Mock
SomeImpClass2 someImpObject2;
@Mock
SomeObject someObject;
@Spy
A a;
@Before
public void setUp() {
when(A.makeNewObject).thenReturn(someObject);
this.A = new A(this.someImpObject1, someImpObject2);
when(someObject.doSomething).thenReturn(something);
}
}
我在这里面临的问题是,虽然我已经对函数 makeNewObject 进行了 stub 以返回 SomeClass 的模拟对象,但代码流仍然在函数(makeNewObject)内部进行并给出 null 异常。
我做错了什么? 我为此浪费了一天的时间。
使用 Mockito 不太流畅。
最佳答案
通过监视和 stub ,您将无法实现您的目标。 这是因为您的目标是 stub 构造函数中使用的方法..但是一旦创建了具体对象并监视它就无法开始 stub ..无法完成..
我建议在测试类中创建一个私有(private)类,该类扩展了被测类,覆盖构造函数中调用的方法,然后在测试中使用它:
@RunWith(MockitoJUnitRunner.class)
public class ATest {
@Mock
SomeObject someObjectMock;
A a;
@Before
public void setUp() {
this.a = new MyTest();
}
private class MyTest extends ATest{
@Override
public makeNewObject(SomeImpClass1 someImpObject1, SomeImpClass2 someImpObject2){
return someObjectMock;
}
}
现在您也不需要对其进行监视和 stub ,因为重写方法始终返回您在测试中期望的内容。
关于java - Mockito 无法模拟目标类构造函数中存在的函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48109371/