使用PowerMockito设置包含私有方法ala this的测试。
类别:
public class SomeMod {
public void somefunc() {
Logger.debug("somefunc");
...
privFunction(param);
...
}
private void privFunction(param) {
Logger.debug("privFunction");
}
}
测试:
@RunWith(PowerMockRunner.class)
@PrepareForTest({SomeMod.class})
public class somemod_test {
...
@Test public void test0() {
SomeMod_spy somemod = spy(new SomeMod());
PowerMockito.when(somemod, "privFunction", "param").thenReturn(someMockedValue);
...
somemod.somefunc();
}
}
当我运行此命令并在两个Logger.debug语句上设置断点时,我看到privFunction
在somefunc
之前被点击。如果我在测试中注释了somemod.somefunc()
的来电,则privFunction
仍然被点击。
我做错了什么?
我使用了PowerMockito.when().thenReturn()
而不是推荐的PowerMockito.doReturn().when()
语法,因为前者会抛出NPE和 UnfinishedStubbingException 。这表明我的测试环境设置不正确。不确定在哪里解决此问题。
答案 0 :(得分:3)
在走一小段路然后重新审视代码之后,问题/答案是模拟 / 间谍调用的关联,以设置{{1} }。
而不是:
doReturn
使用:
spy(new SomeMod())
这将根据文档设置测试。
答案 1 :(得分:2)
您必须使用doReturn()。when()语法来防止模拟方法被调用。这是我所知道的唯一方法。