- 浏览: 573287 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (188)
- java (14)
- web (14)
- web service (3)
- 杂谈 (14)
- Version Control (13)
- software test (30)
- linux (17)
- database (3)
- distributed storage and computing (1)
- ejb (7)
- project building (46)
- spring & IOC (2)
- Thread (2)
- xml (2)
- tool software (0)
- [网站分类]1.网站首页原创Java技术区(对首页文章的要求: 原创、高质量、经过认真思考并精心写作。BlogJava管理团队会对首页的文章进行管理。) (0)
- project manager (9)
- OSGI (1)
- nosql (3)
最新评论
-
sp42:
好搞笑
你懂不懂xml! (2) -
cherishmmo2004:
感觉你们都很牛掰,我们做的一个运维平台也是用karaf的,用k ...
基于osgi开发大型的企业应用 -
liubey:
“自作聪明”的使用了读写锁,其实只使用ReentrantLoc ...
编码最佳实践(4)--小心LinkedHashMap的get()方法 -
liubey:
你这个代码是sublist后仍然一直持有这个sub的引用,一般 ...
编码最佳实践(5)--小心!这只是冰山一角 -
xiegqooo:
初学maven(5)-使用assembly plugin实现自定义打包
前面教程中有个章节讨论到mock和stub的概念差别,一般来说easymock如其名所示,主要是用来做mock用的,但是easymock中也提供有对stub的支持, 主要体现在andStubAnswer(),andStubDelegateTo(),andStubReturn(),andStubThrow()和asStub()等方法的使用上。
我们来看一个实际使用的例子:
private Service service;
private StubService stubService;
public void execute1() {
if (service.execute()) {
stubService.method1();
}
}
public void execute2() {
if (service.execute()) {
stubService.method2();
}
}
public void execute3() {
if (service.execute()) {
stubService.method1();
stubService.method2();
}
}
public void setStubService(StubService stubService) {
this.stubService = stubService;
}
public void setService(Service service) {
this.service = service;
}
}
private interface Service {
public boolean execute();
}
private interface StubService {
public String method1();
public String method2();
}
这里的Business类依赖到Service和StubService,execute1() / execute2() / execute3() 是我们需要测试的三个方法,相同点都是必须调用service.execute(),不同点在于其后对stubService的调用各不相同。而我们假设在这里我们只关心Business类对Service的调用是否如预期,不关心对于StubService的调用,只要程序可以继续运行就可以了。
一个正统的做法是手工写一个StubService的stub 实现,例如:
public String method1() {
return "";
}
public String method2() {
return "";
}
}
但是如果这个接口复杂方法众多,则这个stub类不得不实现所有的其他方法,即使完全用不到,因为java的语法限制。
可以这样使用easymock来实现stub:
private Business business;
private IMocksControl mocksControl;
private Service service;
@Before
public void init() {
business = new Business();
business.setStubService(prepareStubService());
mocksControl = EasyMock.createStrictControl();
service = mocksControl.createMock("service", Service.class);
business.setService(service);
}
private StubService prepareStubService() {
StubService service = EasyMock.createMock("stubService", StubService.class);
service.method1();
EasyMock.expectLastCall().andStubReturn("");
service.method2();
EasyMock.expectLastCall().andStubReturn("");
EasyMock.replay(service);
return service;
}
@Test
public void testExecute1() {
EasyMock.expect(service.execute()).andReturn(true);
mocksControl.replay();
business.execute1();
mocksControl.verify();
}
@Test
public void testExecute2() {
EasyMock.expect(service.execute()).andReturn(false);
mocksControl.replay();
business.execute2();
mocksControl.verify();
}
@Test
public void testExecute3() {
EasyMock.expect(service.execute()).andReturn(true);
mocksControl.replay();
business.execute3();
mocksControl.verify();
}
}
在方法prepareStubService()中,我们通过easymock创建了一个mock对象,然后和普通mock对象一样记录了期望的行为。不同的是用andStubReturn()替代了andReturn().
然后我们直接调用EasyMock.replay(service),注意在这个测试案例中,我们另外创建了一个mocksControl并通过这个mocksControl创建了我们关注的Service接口的mock对象,它的record/replay/和verify()是和StubService完全分离的。这样做的好处是在execute1() / execute2() / execute3()的测试案例中,我们完全不必额外关心这个stub,所有的事情在init()函数中就已经准备好了。这样做的好处显而易见,execute1() / execute2() / execute3()的测试案例中,代码和测试逻辑都简单了。
最后总结,在适当的时候使用easymock来创建stub对象,对于简化测试还是能有所帮助的。
发表评论
-
easymock教程-运行时返回值或者异常
2010-11-30 16:36 5639前面的教程中,我们看到easymock可以通过 ... -
easymock教程-改变同一个方法调用的行为
2010-11-30 17:06 3291在easymock中,对于mock对象的同一个方法,可 ... -
easymock教程-自定义参数匹配器
2010-11-30 18:18 3994虽然easymock中提供了大量的方法来进行参数匹配, ... -
easymock教程-目录
2010-10-14 10:44 8403easymock是目前比较流行的java mock 工 ... -
easymock教程-单元测试中的主要测试对象和依赖
2010-10-14 14:01 3585在单元测试中,通常我们都会有一个明确的测试对象,我们 ... -
easymock教程-record-replay-verify模型
2010-10-15 14:50 7037record-replay-verify 模型容许记录 ... -
easymock教程-easymock的典型使用
2010-10-15 17:14 6146关于easymock的典型使用方式,在easym ... -
easymock教程-class mocking
2010-10-26 16:54 2755前面的例子中,mock的对象都是基于interface ... -
easymock教程-使用MockControl
2010-10-26 17:18 4359在easymock中,通常我们使用一下的代码来创建m ... -
easymock教程-strict和nice
2010-11-19 11:39 4067在easymock的使用过程中,当创建mock对象时, ... -
easymock教程-mock的限制
2010-11-25 11:12 12178easymock并不是万能的,在使用easymock时 ... -
easymock教程-放宽调用次数
2010-11-29 15:55 3199对于mock对象上的mock方法的调用,easymoc ... -
easymock教程-命名mock对象
2010-11-29 16:34 2995在创建mock对象的时候,我们可以命名mock对象。 ... -
easymock教程-参数匹配
2010-11-29 18:57 7130easymock中提供了非常多的方法来实现参数匹配,基 ... -
easymock教程-partial class mocking
2010-11-30 14:23 2834easymock中提供对于类的mock功能,我们可以方 ... -
easymock教程-mock和stub
2010-08-26 15:26 5869作为测试的基本概念,在开发测试中经常遇到mock和st ... -
推荐升级easymock到新的3.0版本
2010-06-26 20:40 1786一直在使用easymock作为mock工具,但是eas ... -
loadrunner license设置问题
2008-02-18 11:35 7375初学loadrunner,今天准备用这个工具测试一下手头的一个 ... -
TestNG官方文档中文版(1)-介绍
2008-03-18 22:25 1730最近决定开始使用TestNG ... -
TestNG官方文档中文版(2)-annotation
2008-03-19 23:22 1850TestNG的官方文档的中文翻译版第二章,原文请见 http: ...
相关推荐
离线安装包,亲测可用
离线安装包,亲测可用
powermock-easymock-junit-1.6.1.zip
powermock-easymock-junit-1.5.4.zip
手动的构造 Mock 对象会给开发人员带来额外的编码量,而且这些为创建 Mock 对象而编写的代码很有可能引入错误。目前,有许多开源项目对动态构建 Mock 对象提供了支持,这些项目能够根据现有的接口或类动态生成,这样...
easymock-2.5.2.jar easymock-2.5.2.jar 单元测试
easymock需要用到的包,没有它不行,easymock-3.1.jar
EasyMock主要是为测试提供模拟数据,比如你可以模拟HttpServletRequest。
还在为EasyMock使用时出异常而烦恼? 本压缩包包含除了Junit4之外easyMock3.1所用到的所有相关jar包,junit4可自己导入eclipse自带的即可 本压缩包包括: asm.jar cglib.jar objenesis.jar等 其中asm与cglib已兼容,放心...
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
java运行依赖jar包
个人作品 4-EasyMock-Servlet.rar
扩展架包啊...easymockclassextension-3.1
EasyMock 是一套通过简单的方法对于指定的接口或类生成 Mock 对象的类库,它能利用对接口或类的模拟来辅助单元测试。 Mock 方法是单元测试中常见的一种技术,它的主要作用是模拟一些在应用中不容易构造或者比较复杂...
easymock 3.1 内含文档和jar包
easymockclassextension-3.0.jar org.easymock.classextension.EasyMock.
jar包,官方版本,自测可用