您如何期望并使用PowerMockito和TestNG验证私有空方法调用?

时间:2014-12-12 15:38:28

标签: java unit-testing testng mockito powermock

我需要使用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);
}

1 个答案:

答案 0 :(得分:0)

好的,这是答案:

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

verifyPrivate(tested).invoke("privateMethodName", argument);

注意在OP的最后一行中缺少invoke方法的使用。

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

取自here

的示例