在单元测试中,经常会遇到一些很难获取测试环境的问题。也就是说,测试程序在特定环境中运行。而产生这些环境有诸多不方便的因素,如:需要Servlet容器,需要连接数据库。或者是某些环境很难获取,如:网络异常等。这些因素在各个方面都限制了单元测试,要么使单元测试变得困难,要么使单元测试变得缓慢。
为了解决上述问题,可以使用Mock解决方案,也就是模拟真实环境。在java中,比较流行的两个Mock工具是JMock和EasyMock。在本文中,将主要介绍EasyMock的使用。
首先,下载EasyMock。目前的版本是2.4,EasyMock只能模拟接口类型,如果需要模拟类,则需要使用EasyMockClassextention。安装EasyMock比较简单,只需要将jar添加至classpath目录中即可。
下面来介绍一个EasyMock的使用步骤:
1.使用EasyMock的第一步是创建一个Mock对象:
UserDao mockDao = EasyMock.createMock(UserDao.class);
2.调用需要模拟的对象,以及在其上设置期望的返回值:
EasyMock.expect(mockDao.exist(username)).andReturn(true); EasyMock.expect(mockDao.validatePassword(username,password)).andReturn(true);
3.将mock对象切换至“播放”状态:
EasyMock.replay(mockDao);
4.像使用真实对象那样使用mock对象。
5.使用后对mock对象进行验证:
EasyMock.verify(mockDao);
以上就是使用EasyMock的最基本的方法。
可以使用IMockControl来批量的控制Mock对象。例如:
IMocksControl control = EasyMock.createControl(); UserDao mockDao = control.createMock(UserDao.class);
可以使用reset()方法清空对所有模拟对象方法调用的期望值。
如果需要模拟类而不是接口,则使用EasyMockClassextention。所需要做的就是将上述代码中的EasyMock类型替换为EasyMockClassextention包中的EasyMock即可。记住:要引入cglib.jar和asm.jar包!