PowerMock没有多次验证私人呼叫


Class to be tested
    public class ClassUnderTest {
    public void functionA() {
        functionB();
        functionC();
    }
    private void functionB() {
    }
    private void functionC() {
    }
}
测试类

@RunWith(PowerMockRunner.class)
public class TestClass {
        @Test
        public void testFunctionA() throws Exception {
            ClassUnderTest classUnderTest = PowerMockito.spy(new ClassUnderTest());
            classUnderTest.functionA();
            PowerMockito.verifyPrivate(classUnderTest).invoke("functionB");
            PowerMockito.verifyPrivate(classUnderTest).invoke("functionC");
        }
    }

在执行测试类时,我得到以下错误,

org.mockito.exceptions.misusing.UnfinishedVerificationException: 
Missing method call for verify(mock) here:
-> at org.powermock.api.mockito.PowerMockito.verifyPrivate(PowerMockito.java:312)
Example of correct verification:
    verify(mock).doSomething()
Also, this error might show up because you verify either of: final/private/equals()/hashCode() methods.
Those methods *cannot* be stubbed/verified.
Mocking methods declared on non-public parent classes is not supported.

如果一个验证被注释,那么测试用例工作良好。

你必须在PrepareForTest中添加ClassUnderTest。

@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassUnderTest.class)
public class TestClass {
@Test
public void testFunctionA() throws Exception {
    ClassUnderTest classUnderTest = PowerMockito.spy(new ClassUnderTest());
    classUnderTest.functionA();
   PowerMockito.verifyPrivate(classUnderTest).invoke("functionB");
   PowerMockito.verifyPrivate(classUnderTest).invoke("functionC");
 }

我刚刚在私有方法&运行测试类

您可以尝试添加两行代码

@RunWith(PowerMockRunner.class)
public class TestClass {
        @Test
        public void testFunctionA() throws Exception {
            ClassUnderTest classUnderTest = PowerMockito.spy(new ClassUnderTest());
            PowerMockito.doNothing().when(classUnderTest, "functionB");
            PowerMockito.doNothing().when(classUnderTest, "functionC");
            classUnderTest.functionA();
            PowerMockito.verifyPrivate(classUnderTest).invoke("functionB");
            PowerMockito.verifyPrivate(classUnderTest).invoke("functionC");
        }
    }

另一个想法是:不要那样做。不要验证私有方法。这些方法是私有的是有原因的。您应该尽量避免编写必须知道某些私有方法被调用的测试。

你看,private的意思是:它是可以改变的。一个好的单元测试是通过观察类的行为来工作的——你调用带有不同参数的公共方法;然后再检查结果。或者,当测试代码需要其他方法来完成工作时,您可以使用依赖注入为测试类提供模拟对象。

但是你真的应该而不是开始检查私有方法。关键是:那些私有方法应该做一些可以从外部观察到的事情。它们要么处理最终的"返回"值;或者它们改变了一些内部状态,这些状态可以通过其他方式检查。换句话说:如果那些私有方法不会对测试中的类造成任何其他影响——那么它们的目的到底是什么呢?

相关内容

  • 没有找到相关文章

最新更新