我最近被介绍给EasyMock,并被要求为使用它的FileMonitor类开发一些单元测试。 FileMonitor类基于一个定时事件,该事件唤醒并检查定义的文件和目录列表中的文件修改。我知道如何使用实际的文件系统来做这件事,写一个写入文件的测试并让FileMonitor完成它的工作。那么,我如何使用EasyMock来做到这一点?我只是不知道如何让EasyMock模拟文件系统。如何用EasyMock模拟文件?
谢谢, 托德
我最近被介绍给EasyMock,并被要求为使用它的FileMonitor类开发一些单元测试。 FileMonitor类基于一个定时事件,该事件唤醒并检查定义的文件和目录列表中的文件修改。我知道如何使用实际的文件系统来做这件事,写一个写入文件的测试并让FileMonitor完成它的工作。那么,我如何使用EasyMock来做到这一点?我只是不知道如何让EasyMock模拟文件系统。如何用EasyMock模拟文件?
谢谢, 托德
东西线沿线的:
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);
为嘲笑的基本技术是引入的接口(如果当前设计没有一个),其提供用于实际服务(依赖)的方法正在被嘲笑。测试正在测试被测试的类与依赖项正确交互。正确地说,这意味着它做到了你期望的事情。这并不意味着它是正确的,因为正确的事情只能通过使用真实组件的集成测试来确定(您想通过创建真实文件来实现)。
所以你需要在被测试的类上有一个方法,让你传入这个接口的实现。最明显的是通过构造函数。你有生产构造函数,用真正实现接触真实文件系统的接口初始化类,然后在测试中将模拟传递给构造函数。
在测试中,您运行类上的方法并断言接口是以您期望的方式调用的。
我会注意到,通过模拟创建单元测试并且通过模拟测试的单元测试的价值有限,但它有助于锁定行为,以便将来的更改不会以令人惊讶的方式打破期望。
我希望能帮助你开始。
一些嘲讽框架支持嘲讽实际的具体类,这在测试单元测试(通过拦截对真实类的调用而不仅仅是接口)中有很多意义。我找不到EasyMock是否允许你这样做,但如果你需要这种功能的话,JDave可能是最好的选择。它甚至可以让你模拟最终课程。
我会把实际的调用放到文件系统的独立包私有方法中。要进行测试,请扩展该类并覆盖该方法。因此,您实际上不会打电话给文件系统。
EasyMocks classextension也可以创建paritial mocks,但我并不完全相信这一点。
http://easymock.org/EasyMock2_4_ClassExtension_Documentation.html
这看起来像我在找什么。在评论更多之前,我需要玩一下这个。感谢您的出色指导。 – Todd 2010-04-22 14:23:55
看来我需要为File创建某种接口,因为EasyMock需要一个接口类型来模拟一个类。会告诉你这件事的进展的。 – Todd 2010-04-22 14:37:23
好的,回到我所在的位置。由于我只是模拟一个接口,我该如何“写”到不再是File类型的模拟对象,而是接口的类型? – Todd 2010-04-22 14:42:28