我需要使用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().when(mock.privateMethod())
语句,因为默认情况下模拟对象中的 void 方法不执行任何操作。
从这里取的例子