使用Powermockito检查是否调用了私有方法

时间:2016-06-02 12:02:12

标签: java unit-testing junit powermockito

我想检查是否使用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()"期间不执行私有方法。 有什么问题?

1 个答案:

答案 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(但这没有任何问题)。

但请记住,测试实施是一种不好的做法,可能导致脆弱的测试。相反,你应该只测试结果。