首先:我正在测试遗留代码。
我正在测试一个抽象类,我们称之为A类。
A类具有类B 类型的字段。 Class B 是Abstract基类的子项,我们将调用 B_Base 。
我的问题:在A类的方法中,B类的实例调用 B_Base中的方法。
我试过模拟一个B类然后用模拟的B类替换Field,但是,每次运行父方法时,Mockito.when()方法中都有一个NullPointerException,这意味着父B_Base类不是嘲笑。
以下是代码的概念。
public abstract class A { //this is the class Im testing.
public B bInstance;
public boolean methodIAmTesting {
int hello = bInstance.method_Only_In_B_Base();
...
}
}
测试:
public class TestClass extends A {
//here is the constructor etc..
@Test
public void test1 {
TestClass x = new TestClass();
bInstance = Mockito.mock(B.class);
// ERROR IS HERE V
Mockito.when(bInstance.method_Only_In_B_Base()).thenReturn(50);
Assert.assertTrue(x.methodIAmTesting());
}
}
答案 0 :(得分:1)
正如J L提到的,你实际上有两个实例,因为你的TestClass扩展了A.
你有什么:
public class TestClass extends A {
@Test public void test1() {
Class TestClass x = new TestClass();
bInstance = Mockito.mock(B.class);
// ...
}
}
你想要什么:
public class TestClass extends A {
@Test public void test1 {
Class TestClass x = new TestClass();
x.bInstance = Mockito.mock(B.class); // <-- replace bInstance on x
// ...
}
}
JUnit会自动创建测试类的实例,因此当您致电x = new TestClass()
时,您正在创建单独的测试实例,并且您正在设置bInstance = mock(B.class)
的调用JUnit创建的实例上的模拟而不是您创建的x
实例。
请注意,将JUnit测试类子类化为被测系统是非常不寻常的。请考虑这样的设计:
@RunWith(JUnit4.class)
public class ATest {
private static class TestClass extends A {
// ...
}
@Test public void test1 {
Class TestClass x = new TestClass();
x.bInstance = Mockito.mock(B.class);
// ...
}
}