- 浏览: 572911 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (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实现自定义打包
前面的教程中,我们看到easymock可以通过expect方法来设定mock方法的返回值或者异常,但是注意这些案例中设置的返回值都是在调用被测试的类的方法前就已经确定下来的,即我们其实在测试类的代码运行前(实际是在EasyMock.replay()方法调用前)就已经"预知"了返回结果。
但是在某些情况下,我们可能无法预知返回值,比如我们需要根据输入的参数值来决定返回什么,而这个参数可能无法在record阶段获得。因此在mock方法中我们无法在record阶段就决定应该返回什么。
对于这种场景,easymock提供了IAnswer接口和andAnswer()方法来提供运行时决定返回值或者异常的机制。
我们来看一个简单的例子:
private Service service;
public void execute() {
int count = ramdonInt();
int result = service.execute(count);
}
public void setService(Service service) {
this.service = service;
}
private int ramdonInt() {
Random random = new Random();
return random.nextInt() / 10000;
}
}
public interface Service {
public int execute(int count);
}
在Business的execute()方法中,需要调用service.execute(int count)方法,而传入的参数count是需要运行时才能确定的,这里为了简单我们random了一个int来模拟这种情况。
然后看测试案例
public void testRuntimeReturn() {
Business business = new Business();
Service service = EasyMock.createMock(Service.class);
business.setService(service);
EasyMock.expect(service.execute(EasyMock.anyInt())).andAnswer(new IAnswer<Integer>() {
public Integer answer() throws Throwable {
Integer count = (Integer) EasyMock.getCurrentArguments()[0];
return count * 2;
}
});
EasyMock.replay(service);
business.execute();
EasyMock.verify(service);
}
这里我们通过EasyMock.expect(service.execute(EasyMock.anyInt()))来接受任意值的count参数输入,andAnswer(new IAnswer<Integer>() {}) 让我们可以指定一个IAnswer的实现类来给出返回值。在这个IAnswer的实现类中,我们通过EasyMock.getCurrentArguments()[0]获取到service.execute()方法的第一个参数,然后简单的运用count*2规则给出返回值。这里的EasyMock.getCurrentArguments()方法可以获取到运行时的参数列表,不过注意这个方法对重构不够友好,如果参数列表发生变化则必须手工修改对象的获取参数的代码。
下面是一个运行时抛出异常的例子,简单起见我们通过设置exception的message来在错误信息中传递运行时的count值。
public void testRuntimeException() {
Business business = new Business();
Service service = EasyMock.createMock(Service.class);
business.setService(service);
EasyMock.expect(service.execute(EasyMock.anyInt())).andAnswer(new IAnswer<Integer>() {
public Integer answer() throws Throwable {
Integer count = (Integer) EasyMock.getCurrentArguments()[0];
throw new RuntimeException("count=" + count);
}
});
EasyMock.replay(service);
try {
business.execute();
fail("should throw RuntimeException");
} catch (RuntimeException e) {
assertTrue(e.getMessage().indexOf("count=") != -1);
//get count from message
EasyMock.verify(service);
}
}
除了IAnswer接口外,easymock中还有另外一个方式可以完成类似的功能,就是使用andDelegate()方法,
public int execute(int count) {
return count * 2;
}
}
@Test
public void testRuntimeReturn() {
Business business = new Business();
Service service = EasyMock.createMock(Service.class);
business.setService(service);
EasyMock.expect(service.execute(EasyMock.anyInt())).andDelegateTo(new ServiceStub());
EasyMock.replay(service);
business.execute();
EasyMock.verify(service);
}
这里需要先创建一个Service类的实现类和一个实例,然后通过andDelegateTo()将这个stub的实例传进去,注意这里delegate进去的实例必须是mock对象接口相同。
delegateTo方式实际上是我们手工创建了stub(mock和stub的概念及差别请参考本教程的"mock和stub"一文),这和我们使用easymock的初衷有所违背。而且当这个接口有众多方法时,创建这样一个stub会显得很痛苦,不如使用IAnswer方便直接。
发表评论
-
easymock教程-改变同一个方法调用的行为
2010-11-30 17:06 3288在easymock中,对于mock对象的同一个方法,可 ... -
easymock教程-自定义参数匹配器
2010-11-30 18:18 3991虽然easymock中提供了大量的方法来进行参数匹配, ... -
easymock教程-目录
2010-10-14 10:44 8398easymock是目前比较流行的java mock 工 ... -
easymock教程-单元测试中的主要测试对象和依赖
2010-10-14 14:01 3581在单元测试中,通常我们都会有一个明确的测试对象,我们 ... -
easymock教程-record-replay-verify模型
2010-10-15 14:50 7025record-replay-verify 模型容许记录 ... -
easymock教程-easymock的典型使用
2010-10-15 17:14 6141关于easymock的典型使用方式,在easym ... -
easymock教程-class mocking
2010-10-26 16:54 2749前面的例子中,mock的对象都是基于interface ... -
easymock教程-使用MockControl
2010-10-26 17:18 4356在easymock中,通常我们使用一下的代码来创建m ... -
easymock教程-strict和nice
2010-11-19 11:39 4062在easymock的使用过程中,当创建mock对象时, ... -
easymock教程-创建stub对象
2010-11-23 17:51 3106前面教程中有个章节讨论到mock和stub的概念差 ... -
easymock教程-mock的限制
2010-11-25 11:12 12176easymock并不是万能的,在使用easymock时 ... -
easymock教程-放宽调用次数
2010-11-29 15:55 3197对于mock对象上的mock方法的调用,easymoc ... -
easymock教程-命名mock对象
2010-11-29 16:34 2993在创建mock对象的时候,我们可以命名mock对象。 ... -
easymock教程-参数匹配
2010-11-29 18:57 7127easymock中提供了非常多的方法来实现参数匹配,基 ... -
easymock教程-partial class mocking
2010-11-30 14:23 2831easymock中提供对于类的mock功能,我们可以方 ... -
easymock教程-mock和stub
2010-08-26 15:26 5866作为测试的基本概念,在开发测试中经常遇到mock和st ... -
推荐升级easymock到新的3.0版本
2010-06-26 20:40 1783一直在使用easymock作为mock工具,但是eas ... -
loadrunner license设置问题
2008-02-18 11:35 7370初学loadrunner,今天准备用这个工具测试一下手头的一个 ... -
TestNG官方文档中文版(1)-介绍
2008-03-18 22:25 1729最近决定开始使用TestNG ... -
TestNG官方文档中文版(2)-annotation
2008-03-19 23:22 1848TestNG的官方文档的中文翻译版第二章,原文请见 http: ...
相关推荐
离线安装包,亲测可用
离线安装包,亲测可用
powermock-easymock-junit-1.6.1.zip
powermock-easymock-junit-1.5.4.zip
easymock-2.5.2.jar easymock-2.5.2.jar 单元测试
easymock需要用到的包,没有它不行,easymock-3.1.jar
它提供对接口的模拟,能够通过录制、回放、检查三步来完成大体的测试过程,可以验证方法的调用种类、次数、顺序,可以令 Mock 对象返回指定的值或抛出指定异常。通过 EasyMock,我们可以方便的构造 Mock 对象从而使...
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 3.1 内含文档和jar包
easymockclassextension-3.0.jar org.easymock.classextension.EasyMock.
easymock-3.3.jar
Mock 方法是单元测试中常见的一种技术,它的主要作用是模拟一些在应用中不容易构造或者比较复杂的对象,从而把测试与测试边界以外的对象隔离开。 编 写自定义的 Mock 对象需要额外的编码工作,同时也可能引入错误。...