Java 您如何期望和验证使用PowerMockito和TestNG的私有void方法调用?

Java 您如何期望和验证使用PowerMockito和TestNG的私有void方法调用?,java,unit-testing,testng,mockito,powermock,Java,Unit Testing,Testng,Mockito,Powermock,我需要使用TestNG、Mockito和现在的PowerMockito对预先存在的代码库编写单元测试,以便更轻松地测试私有和静态方法。我目前正试图针对我们正在测试的类中的一个私有void方法编写一个测试,但无法解决它。在普通的PowerMock API中,有称为replayAll、verifyAll和expectLastCalled的方法,它们适用于大多数用途。我就是找不到好的文档来解释如何用PowerMockito的方式来做。对此的任何解释或见解都将不胜感激 测试方法: private voi

我需要使用TestNG、Mockito和现在的PowerMockito对预先存在的代码库编写单元测试,以便更轻松地测试私有和静态方法。我目前正试图针对我们正在测试的类中的一个私有void方法编写一个测试,但无法解决它。在普通的PowerMock API中,有称为replayAll、verifyAll和expectLastCalled的方法,它们适用于大多数用途。我就是找不到好的文档来解释如何用PowerMockito的方式来做。对此的任何解释或见解都将不胜感激

测试方法:

private void pVMethod(Type param) throws Exception {

    param.setA(StaticClass.methodA().toString());
    param.setB(StaticClass.methodB().toString());

    // getMemo(String label) is in a public class in same package
    param.setC(getMemo("memo.provider"));
    param.setD(getMemo("memo.item"));
        try {
             param.setTimestamp(DataTypeFactory.newInstance().newXMLGregorianCalendar(newjava.util.GregorianCalendar()));
        } catch (SomeException e) {
           ...
          throw new Exception();
    }
}
测试尝试:

@Test(expectedExceptions = Exception.class)
public void pVMethod() throws Exception {
    TestClass testMock = mock(TestClass.class);
    Exception exception = mock(Exception.class);

    // StaticClass staticClassMock = mock(StaticClass.class); ??
    mockStatic(StaticClass.class);

    // when(..) and thenReturn(..) are static imports from PowerMockito library
    when(StaticClass.methodA()).thenReturn("stubStringA");
    when(StaticClass.methodB()).thenReturn("stubStringB");

    doThrow(exception).when(param).setTimestamp(Mockito.any(XMLGregorianCalendar.class));

    // Docs say method name can be inferred via reflection
    Whitebox.invokeMethod(tested, event);

    // this is where things are hairy. testedSpy is defined at the top level
    verifyPrivate(testedSpy).pVMethod(testMock);
}

好的,下面是答案:

在PowerMockito中,如果要验证私有void方法的行为,可以使用verifyPrivate方法,但必须这样做:

verifyPrivate(tested).invoke("privateMethodName", argument);
请注意调用方法的使用,该方法在OP的最后一行中丢失

注意:您不必使用doNothing.whenmock.privateMethod语句,因为默认情况下模拟对象中的void方法不会执行任何操作


示例取自

有点离题,但为什么要测试私有方法?单元测试应该测试功能,而不是我的主管告诉我的实现。我对这种规模的测试还不熟悉,不知道为什么会这样做。但我可以说,powermock是为了满足测试私有和静态方法/字段等的需求而设计的,否则这些方法/字段将无法访问。如果您提供更多的上下文,可能会有所帮助。测试私有方法有一些正当的理由,但如果没有整个画面,给出建议就更困难了你的主管是个傻瓜。不需要测试私有方法。相反,测试公共、受保护和包访问方法,私有方法将被覆盖。哈,好的。我会和他谈谈。但尝试验证调用了私有void方法是否不合理?i、 e.为什么有一种称为verifyPrivate的方法,正确的使用方法是什么?