easymock教程

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

easymock教程作者:skydream教程,详细的介绍easymock的使用页本书由JavaEye提供的电子书DIY功能自动生成于2010-12-06目录1.softwaretest1.1easymock教程-目录................................................................31.2easymock教程-mock和stub.........................................................61.3easymock教程-单元测试中的主要测试对象和依赖.......................................121.4easymock教程-record-replay-verify模型.............................................151.5easymock教程-easymock的典型使用.................................................181.6easymock教程-classmocking......................................................211.7easymock教程-mock的限制........................................................241.8easymock教程-strict和nice.........................................................281.9easymock教程-创建stub对象.......................................................351.10easymock教程-放宽调用次数......................................................401.11easymock教程-参数匹配..........................................................421.12easymock教程-partialclassmocking...............................................461.13easymock教程-运行时返回值或者异常...............................................511.14easymock教程-改变同一个方法调用的行为...........................................551.15easymock教程-自定义参数匹配器...................................................571.16easymock教程-命名mock对象.....................................................611.17easymock教程-使用MockControl..................................................64页1.1easymock教程-目录发表时间:2010-10-14easymock是目前比较流行的javamock工具,这个教程将比较详细的介绍easymock的使用。主要内容来自easymock的官网介绍和教程,我针对日常使用情况进行了一些筛选和补充,另外增加一些个人的理解和认识,希望能对不熟悉easymock的朋友们有所帮助。如有疏漏,错误或者疑惑,欢迎大家指正和提醒,不胜感激。一.基本概念这里讲述一些测试相关的基本概念,不仅仅适用于easymock,也同样适用于其他的mock框架如jmock,jmockit等。1)mock和stub2)单元测试中的主要测试对象和依赖3)record-replay-verify模型二.基础教程1)典型使用2)ClassMocking页3)mock的限制4)strict和nice5)创建stub对象6)放宽调用次数7)参数匹配三.高级教程1)Partialclassmocking2)运行时返回值或者异常3)改变同一个方法调用的行为4)自定义参数匹配器四.最佳实践1)命名mock对象页2)使用MocksControl页1.2easymock教程-mock和stub发表时间:2010-08-26作为测试的基本概念,在开发测试中经常遇到mock和stub。之前认为自己对这两个概念已经很明白了,但是当决定要写下来并写清楚以便能让不明白的人也能弄明白,似乎就很有困难。试着写下此文,以检验自己是不是真的明白mock和stub。一.相同点先看看两者的相同点吧,非常明确的是,mock和stub都可以用来对系统(或者将粒度放小为模块,单元)进行隔离。在测试,尤其是单元测试中,我们通常关注的是主要测试对象的功能和行为,对于主要测试对象涉及到的次要对象尤其是一些依赖,我们仅仅关注主要测试对象和次要测试对象的交互,比如是否调用,何时调用,调用的参数,调用的次数和顺序等,以及返回的结果或发生的异常。但次要对象是如何执行这次调用的具体细节,我们并不关注,因此常见的技巧就是用mock对象或者stub对象来替代真实的次要对象,模拟真实场景来进行对主要测试对象的测试工作。因此从实现上看,mock和stub都是通过创建自己的对象来替代次要测试对象,然后按照测试的需要控制这个对象的行为。二.不同点1.类实现的方式从类的实现方式上看,stub有一个显式的类实现,按照stub类的复用层次可以实现为普通类(被多个测试案例复用),内部类(被同一个测试案例的多个测试方法复用)乃至内部匿名类(只用于当前测试方法)。对于stub的方法也会有具体的实现,哪怕简单到只有一个简单的return语句。而mock则不同,mock的实现类通常是有mock的工具包如easymock,jmock来隐式实现,具体mock的方法的行为则通过record方式来指定。以mock一个UserService,UserDao为例,最简单的例子,只有一个查询方法:页publicinterfaceUserService{Userquery(StringuserId);}publicclassUserServiceImplimplementsUserService{privateUserDaouserDao;publicUserquery(StringuserId){returnuserDao.getById(userId);}//setterforuserDao}publicinterfaceUserDao{UsergetById(StringuserId);}stub的标准实现,需要自己实现一个类并实现方法:publicclassUserDaoStubimplementsUserDao{publicUsergetById(Stringid){Useruser=newUser();user.set.....returnuser;}}@TestpublicvoidtestGetById(){UserServiceImplservice=newUserServiceImpl();UserDaouserDao=newUserDaoStub();service.setUserDao(userDao);Useruser=service.query(1001);页...}mock的实现,以easymock为例,只要指定mock的类并record期望的行为,并没有显式的构造新类:@TestpublicvoidtestGetById(){UserDaodao=Easymock.createMock(UserDao.class);Useruser=newUser();user.set.....Easymock.expect(dao.getById(1001)).andReturn(user);Easymock.reply(dao);UserServiceImplservice=newUserServiceImpl();service.setUserDao(userDao);Useruser=service.query(1001);...Easymock.verify(dao);}对比可以看出,mock编写相对简单,只需要关注被使用的函数,所谓justenough。stub要复杂一些,需要实现逻辑,即使是不需要关注的方法也至少要给出空实现。2.测试逻辑的可读性从上面的代码可以看出,在形式上,mock通常是在测试代码中直接mock类和定义mock方法的行为,测试代码和mock的代码通常是放在一起的,因此测试代码的逻辑也容易从测试案例的代码上看出来。Easymock.expect(dao.getById(1001)).andReturn(user);直截了当的指明了当前测试案例对UserDao这个依赖的预期:getById需要被调用,调用的参数应该是1001,调用次数为1(不明确指定调用次数时easymock默认为1)。而stub的测试案例的代码中只有简单的UserDaouserDao=newUserDaoStub();构造语句和页service.setUserDao(userDao);设置语句,我们无法直接从测试案例的代码中看出对依赖的预期,只能进入具体的UserServiceImpl类的query()方法,看到具体的实现是调用userDao.getById(userId),这个时候才能明白完整的测试逻辑。因此当测试逻辑复杂,stub数量多并且某些stub需要传入一些标记比如true,false之类的来制定不同的行为时,测试逻辑的可读性就会下降。3.可复用性Mock通常很少考虑复用,每个mock对象通过都是遵循justenough原则,一般只适用于当前测试方法。因此每个测试方法都必须实现自己的mock逻辑,当然在同一个测试类中还是可以有一些简单的初始化逻辑可以复用。stub则通常比较方便复用,尤其是一些通用的stub,比如jdbc连接之类。spring框架就为此提供了大量的stub来方便测试,不过很遗憾的是,它的名字用错了:spring-mock!4.设计和使用接着我们从mock和stub的设计和使用上来比较两者,这里需要引入两个概念:interaction-based和state-based。具体关于interaction-based和state-based,不再本文阐述,强烈推荐MartinFowler的一篇文章,MocksAren'tStubs。地址为(

1 / 65
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功