我想检查是否使用powermockito执行了我要测试的类的私有方法。
假设我要测试这个类:
public class ClassToTest {
public boolean methodToTest() {
//doSomething (maybe call privateMethod or maybeNot)
return true;
}
//I want to know if this is called or not during the test of "methodToTest".
private void privateMethod() {
//do something
}
}
当我测试" methodToTest"我想检查它是否返回正确的结果,但是如果它执行私有方法" privateMethod"或不。 在其他讨论中搜索我写了这个使用powermockito的测试,但它不起作用。
public class TestClass {
@Test
testMethodToTest(){
ClassToTest instance = new ClassToTest();
boolean result = instance.methodToTest();
assertTrue(result, "The public method must return true");
//Checks if the public method "methodToTest" called "privateMethod" during its execution.
PowerMockito.verifyPrivate(instance, times(1)).invoke("privateMethod");
}
}
当我使用调试器时,似乎最后一行(PowerMockito.verifyPrivate ...)没有检查私有方法是否在测试期间执行了一次,而是看起来它执行私有方法本身。此外,测试通过,但使用调试器,我确保在调用" instance.methodToTest()"期间不执行私有方法。 有什么问题?
答案 0 :(得分:1)
如果没有PowerMockito,我会更轻松。考虑一下(它是某种 Spy 对象):
public class TestClassToTest {
private boolean called = false;
@Test
public void testIfPrivateMethodCalled() throws Exception {
//given
ClassToTest classToTest = new ClassToTest() {
@Override
void privateMethod() {
called = true;
}
};
//when
classToTest.methodToTest();
//then
assertTrue(called);
}
}
这需要将privateMethod()
更改为package-private(但这没有任何问题)。
但请记住,测试实施是一种不好的做法,可能导致脆弱的测试。相反,你应该只测试结果。