2010-04-22 87 views
3

我最近被介绍给EasyMock,并被要求为使用它的FileMonitor类开发一些单元测试。 FileMonitor类基于一个定时事件,该事件唤醒并检查定义的文件和目录列表中的文件修改。我知道如何使用实际的文件系统来做这件事,写一个写入文件的测试并让FileMonitor完成它的工作。那么,我如何使用EasyMock来做到这一点?我只是不知道如何让EasyMock模拟文件系统。如何用EasyMock模拟文件?

谢谢, 托德

回答

5

东西线沿线的:

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); 
+0

这看起来像我在找什么。在评论更多之前,我需要玩一下这个。感谢您的出色指导。 – Todd 2010-04-22 14:23:55

+0

看来我需要为File创建某种接口,因为EasyMock需要一个接口类型来模拟一个类。会告诉你这件事的进展的。 – Todd 2010-04-22 14:37:23

+0

好的,回到我所在的位置。由于我只是模拟一个接口,我该如何“写”到不再是File类型的模拟对象,而是接口的类型? – Todd 2010-04-22 14:42:28

0

为嘲笑的基本技术是引入的接口(如果当前设计没有一个),其提供用于实际服务(依赖)的方法正在被嘲笑。测试正在测试被测试的类与依赖项正确交互。正确地说,这意味着它做到了你期望的事情。这并不意味着它是正确的,因为正确的事情只能通过使用真实组件的集成测试来确定(您想通过创建真实文件来实现)。

所以你需要在被测试的类上有一个方法,让你传入这个接口的实现。最明显的是通过构造函数。你有生产构造函数,用真正实现接触真实文件系统的接口初始化类,然后在测试中将模拟传递给构造函数。

在测试中,您运行类上的方法并断言接口是以您期望的方式调用的。

我会注意到,通过模拟创建单元测试并且通过模拟测试的单元测试的价值有限,但它有助于锁定行为,以便将来的更改不会以令人惊讶的方式打破期望。

我希望能帮助你开始。

一些嘲讽框架支持嘲讽实际的具体类,这在测试单元测试(通过拦截对真实类的调用而不仅仅是接口)中有很多意义。我找不到EasyMock是否允许你这样做,但如果你需要这种功能的话,JDave可能是最好的选择。它甚至可以让你模拟最终课程。

2

看一看优秀的(和简洁)manual。尽管你可能会重新考虑使用EasyMock,但大多数人正在使用或正在使用更高级和更积极开发的Mockito(受EasyMock的启发)。

+0

感谢您的提示。不幸的是,我没有选择,这是公司选择的。至于手册,我在提问之前已经通读了它,猜想我错过了关于文件系统的部分。 – Todd 2010-04-22 14:21:50

相关问题