【发布时间】:2016-07-01 23:42:51
【问题描述】:
我是 PowerMockito 的新手,它显示的行为我不明白。以下代码解释了我的问题:
public class ClassOfInterest {
private Object methodIWantToMock(String x) {
String y = x.trim();
//Do some other stuff;
}
public void methodUsingThePrivateMethod() {
Object a = new Object();
Object b = methodIWantToMock("some string");
//Do some other stuff ...
}
}
我有一个类,其中包含一个我想模拟的私有方法,称为methodIWantToMock(String x)。在我的测试代码中,我正在执行以下操作:
@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassOfInterest.class)
public class ClassOfInterestTest {
@Test
public void someTestMethod() {
ClassOfInterest coiSpy = PowerMockito.spy(new ClassOfInterest());
PowerMockito.doReturn(null).when(coiSpy, "methodIWantToMock", any(String.class));
coiSpy.methodUsingThePrivateMethod();
//Do some stuff ...
}
}
根据上面的代码,当我运行上面的测试时,只要在methodUsingThePrivateMethod() 中调用methodIWantToMock,PowerMockito 就应该简单地返回一个空值。然而实际发生的是,当运行此命令时:PowerMockito.doReturn(...).when(...),PowerMockito 实际上正在调用methodIWantToMock! 为什么要这样做?在这个阶段,我只想指定在运行coiSpy.methodUsingThePrivateMethod(); 行时最终调用私有方法后如何模拟私有方法。
【问题讨论】:
-
您在模拟对象上调用
methodUsingThePrivateMethod(),而后者又在内部调用methodIWantToMock("some string")。您在这里期待什么行为? -
没错,但是通过调试我发现当我运行
doReturn().when()命令时,PowerMockito 调用了methodIWantToMock()。它不会等待methodUsingThePrivateMethod()调用它。 -
我通过调试发现了这种行为。如果我运行测试(没有调试),测试会因为生成
NullPointerException而崩溃,因为当执行doReturn(...).when(...)命令时,PowerMockito 运行私有方法同时将null作为输入传递,所以当String y = x.trim();在methodUsingThePrivateMethod()内部执行,会生成一个NullPointerException。底线 === 命令coiSpy.methodUsingThePrivateMethod();永远不会被调用。
标签: java mockito powermockito