我最近被介绍给EasyMock,并被要求使用它为FileMonitor类开发一些单元测试。 FileMonitor类基于一个定时事件,该事件唤醒并检查已定义的文件和目录列表中的文件修改。我得到了如何使用实际的文件系统执行此操作,编写一个写入文件的测试并让FileMonitor执行其操作。那么,我如何使用EasyMock做到这一点?我只是不知道如何让EasyMock模拟文件系统。
谢谢, 托德
答案 0 :(得分:6)
有些事情:
import static org.easymock.classextension.EasyMock.*;
File testDir = createMock(File.class);
expect(testDir.lastModified()).andReturn(10L);
// more expectations
replay(testDir);
// create a FileMonitor watching testDir
// run the method which gets invoked by the trigger
verify(testDir);
答案 1 :(得分:2)
答案 2 :(得分:0)
模拟的基本技术是引入一个接口(如果当前设计没有接口),它为正在模拟的实际服务(依赖项)提供方法。测试是测试被测试的类与依赖项正确交互。正确地说这意味着它做了你期望它做的事情。这并不意味着它做正确的事情,因为正确的事情只能通过使用真实组件的集成测试来确定(你想象通过创建一个真实的文件)。
所以你需要在被测试的类上有一个方法,让你传入这个接口的实现。最明显的是通过构造函数。你有生产构造函数,它使用真实文件系统接口的实际实现初始化类,然后在测试中将mock传递给构造函数。
在测试中,您在类上运行方法并断言以您期望的方式调用接口。
我会注意到,在课程创建和通过模拟进行单元测试之后出现的价值有限,但它有助于锁定行为,以便未来的课程更改不会以令人惊讶的方式打破期望。
我希望这有助于您入门。
一些模拟框架支持模拟实际的具体类,这可以在单元测试后测试很多(通过拦截对实际类的调用而不仅仅是接口)。我无法找到EasyMock是否允许您这样做,但如果您需要这种功能,JDave可能就是您要去的地方。它甚至可以让你模拟最后的课程。
答案 3 :(得分:0)
我会将文件系统的实际调用放在单独的package-private方法中。要进行测试,请扩展该类并覆盖该方法。因此,您实际上并未调用文件系统。
EasyMocks classextension也有可能创造一些蠢货,但我并不完全相信。
http://easymock.org/EasyMock2_4_ClassExtension_Documentation.html