Quick summary
PowerMock在0.9版本提供了replayAll,verifyAll,resetAll 三个方法,很多刚开始学习使用的PowerMock工具的同学不太清楚这三个方法的具体作用是什么,
在这里作个简单的介绍:
1、PowerMock.replayAll() 方法是使得PowerMock创建和维护的Mock对象和类进入回放模式。 也就是说让mock生效了。
2、PowerMock.verifyAll()方法是验证PowerMock创建和维护的Mock对象和类是有效的
3、PowerMock.resetAll() 方法是使得PowerMock创建和维护的Mock对象和类恢复初始状态,这是mock出来的对象也就是无效状态。
官网给了个例子
public class PersistenceManager {
public boolean createDirectoryStructure(String directoryPath) {
File directory = new File(directoryPath);
if (directory.exists()) {
throw new IllegalArgumentException("\"" + directoryPath + "\" already exists.");
}
return directory.mkdirs();
}
}
这是一个被测试类,测试代码如下:
@Test
public void testCreateDirectoryStructure_ok() throws Exception {
final String path = "directoryPath";
// Using PowerMock's createMock method.
File fileMock = createMock(File.class);
PersistenceManager tested = new PersistenceManager();
expectNew(File.class, path).andReturn(fileMock);
expect(fileMock.exists()).andReturn(false);
expect(fileMock.mkdirs()).andReturn(true);
// Using replay all
replayAll();
assertTrue(tested.createDirectoryStructure(path));
// Using verify all
verifyAll();
}
ReplayAll() 方法调用后,PowerMock把它自己创建的Mock对象fileMock设置成回放模式,这是mock真正生效了。 因为PowerMock支持EasyMock和Mokito,如果Mock对象不是由PowerMock自己创建的而是EasyMock来创建出来的fileMock, 这时在调用replayall()就无效了,因为PowerMock 没有找到自己创建的Mock对象,那么这种情况就要强行指定例如:
File fileMock = EasyMock.createMock(File.class);
replayall(fileMock);
这样fileMock才会真正生效,最有调用verifyAll() 来检验一下mock对象是否生效。