首页 > 解决方案 > Powermock verifyPrivate 不适用于 any()

问题描述

我有一个私有方法,我想在不关心参数的情况下测试它的调用。我想测试它是否被调用。

MyClass.java

public void doStuff(){
    unload(args);
}

private void unload(List<String> args) {
    // 
}

所以我使用了以下内容:

MyClasstest.java

MyClass myClass = PowerMockito.spy(new MyClass());
myClass.doStuff();
verifyPrivate(myClass, times(1)).invoke("unload",any(List.class));
//     verifyPrivate(myClass, times(1)).invoke("unload",any());  //same result with this

此测试失败,但出现以下异常:

需要但未调用 com.MyClass.unload(null);

然而,这个模拟还有其他交互......(调用它的实际值)

可以仅使用实际参数而不使用 来调用 verifyPrivateany()吗?

标签: javajunitmockitopowermock

解决方案


这是您尝试做的一个工作示例:

您可能只是错过了@PrepareForTest注释,它必须指向正确的类。如果你的类是一个外部的 use @PrepareForTest(MyClass.class),下面的例子用一个内部类来展示它。

@RunWith(PowerMockRunner.class)
@PrepareForTest(MyClassTest.class)
public class MyClassTest {

    static class MyClass {

        public void doStuff(){
            unload(null);
        }

        private void unload(List<String> args) {
        }
    }

    @Test
    public void test() throws Exception {
        MyClass myClass = PowerMockito.spy(new MyClass());
        myClass.doStuff();
        PowerMockito.verifyPrivate(myClass, Mockito.times(1)).invoke("unload", Mockito.any());
    }
}

请注意,您应该考虑是否真的要在 UnitTest 中执行此操作。通常你的 UnitTest 不应该关心是否private使用了一个方法,它应该专注于验证是否返回了正确的结果或达到了正确的对象状态。

通过将有关类的内部行为的知识添加到其中,您的测试与实现紧密耦合,这可能不是一件好事。


推荐阅读