前面的例子中,mock的对象都是基于interface,虽然说我们总是强调要面对接口编程,而不要面对实现,但是实际开发中不提取interface而直接使用class的场景非常之多。尤其是一些当前只有一个明确实现而看不到未来扩展的类,是否应该提取interface或者说是否应该现在就提取interface,总是存在争论。
这种情况下,我们就会面临主要测试对象依赖到一个具体类而不是interface的情况,easymock中通过class extension 来提供对class mocking的支持。
1. class mocking的使用
easymock class extension的使用方式和普通的interface mock完全一致,基本上easymock中有的功能easymock class extension都同样提供,而且所有的类名和方法名都保持一致。
ClassA impl = Easymock.createMock(ClassA.class);
Easymock.expect(impl.getById("1001")).andReturn(...);
Easymock.replay(impl);
唯一的差异在于,easymock class extension的java package和easymock不同,easymock是org.easymock.*, 而 easymock class extension是org.easymock.classextension.*,典型如 org.easymock.classextension.Easymock 对应 org.easymock.Easymock。另外在发布时,两者是分开发布的,easymock.jar 和 easymockclassextension.jar,需要根据需要分别导入,或者必要时同时导入。
2. 3.0新版本和向后兼容
我们来回顾一下easymock的历史版本: easymock 1.* 非常久远了,已经没有人在用。2.0版本在2005-12-24发布,基于jdk1.5,之后陆续发布的2.1/2.2/2.3/2.4/2.5等几个版本中,都提供了对应版本的easymock class extension。easymock 3.0 版本是最新版本,2010-05-08 发布,主要改进就是将easymock class extension的功能合并到easymock中,以后只要使用easymock就可以提供class mocking的功能。当然为了兼容2.*下的旧代码,依然提供了EasyMock 3.0 Class Extension代理到easymock 3.0。
3.0版本之后,easymock class extension的class mocking功能已经无缝集成到easymock中,因此代码的编写简洁了很多,强烈建议新用户直接使用3.0版本。对于使用2.*版本的旧有代码,easymock提供了easymock class extension的3.0版本,兼容2.*的代码,底层实现实际是代理给easymock3.0。因此2.*版本easymock class extension的用户可以通过简单的升级easymock class extension到3.0即可平滑升级,之后再逐渐替换掉easymock class extension的代码。
3. class mocking的限制
class mocking是有一些限制的,
1) 不能mock类的 final方法
如果final方法被调用,则只能执行原有的正常代码。
2) 不能mock类的static 方法。
同样如果private方法被调用,只能执行原有的正常代码。
3) 不能mock类的一些特殊方法: equals(), toString()和hashCode().
原因是easymock在实现是为每个class mock对象提供了内建的以上三个方法。需要强调的是,对于基于interface的mock,这个限制也是同样存在的,即使以上三个方式是interface定义的一部分。
在使用时需要避开这种场景,或者组合使用其他的mock 框架比如jmockit来mock private方法和final方法。
分享到:
相关推荐
离线安装包,亲测可用
离线安装包,亲测可用
powermock-easymock-junit-1.6.1.zip
powermock-easymock-junit-1.5.4.zip
EasyMock主要是为测试提供模拟数据,比如你可以模拟HttpServletRequest。
easymock-2.5.2.jar easymock-2.5.2.jar 单元测试
easymock需要用到的包,没有它不行,easymock-3.1.jar
EasyMock 是一套用于通过简单的方法对于给定的接口生成 Mock 对象的类库。它提供对接口的模拟,能够通过录制、回放、检查三步来完成大体的测试过程,可以验证方法的调用种类、次数、顺序,可以令 Mock 对象返回指定...
easymockclassextension-3.0.jar org.easymock.classextension.EasyMock.
扩展架包啊...easymockclassextension-3.1
还在为EasyMock使用时出异常而烦恼? 本压缩包包含除了Junit4之外easyMock3.1所用到的所有相关jar包,junit4可自己导入eclipse自带的即可 本压缩包包括: asm.jar cglib.jar objenesis.jar等 其中asm与cglib已兼容,放心...
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
easymockclassextension-2.4.jar是一个很齐全的jar包,可以放心下载使用
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
java运行依赖jar包
个人作品 4-EasyMock-Servlet.rar
jar包,官方版本,自测可用
jar包,官方版本,自测可用