- 浏览: 583246 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (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 3338在easymock中,对于mock对象的同一个方法,可 ... -
easymock教程-自定义参数匹配器
2010-11-30 18:18 4065虽然easymock中提供了大量的方法来进行参数匹配, ... -
easymock教程-目录
2010-10-14 10:44 8451easymock是目前比较流行的java mock 工 ... -
easymock教程-单元测试中的主要测试对象和依赖
2010-10-14 14:01 3654在单元测试中,通常我们都会有一个明确的测试对象,我们 ... -
easymock教程-record-replay-verify模型
2010-10-15 14:50 7285record-replay-verify 模型容许记录 ... -
easymock教程-easymock的典型使用
2010-10-15 17:14 6204关于easymock的典型使用方式,在easym ... -
easymock教程-class mocking
2010-10-26 16:54 2802前面的例子中,mock的对象都是基于interface ... -
easymock教程-使用MockControl
2010-10-26 17:18 4452在easymock中,通常我们使用一下的代码来创建m ... -
easymock教程-strict和nice
2010-11-19 11:39 4142在easymock的使用过程中,当创建mock对象时, ... -
easymock教程-创建stub对象
2010-11-23 17:51 3158前面教程中有个章节讨论到mock和stub的概念差 ... -
easymock教程-mock的限制
2010-11-25 11:12 12217easymock并不是万能的,在使用easymock时 ... -
easymock教程-放宽调用次数
2010-11-29 15:55 3252对于mock对象上的mock方法的调用,easymoc ... -
easymock教程-命名mock对象
2010-11-29 16:34 3040在创建mock对象的时候,我们可以命名mock对象。 ... -
easymock教程-参数匹配
2010-11-29 18:57 7207easymock中提供了非常多的方法来实现参数匹配,基 ... -
easymock教程-partial class mocking
2010-11-30 14:23 2886easymock中提供对于类的mock功能,我们可以方 ... -
easymock教程-mock和stub
2010-08-26 15:26 5917作为测试的基本概念,在开发测试中经常遇到mock和st ... -
推荐升级easymock到新的3.0版本
2010-06-26 20:40 1843一直在使用easymock作为mock工具,但是eas ... -
loadrunner license设置问题
2008-02-18 11:35 7465初学loadrunner,今天准备用这个工具测试一下手头的一个 ... -
TestNG官方文档中文版(1)-介绍
2008-03-18 22:25 1789最近决定开始使用TestNG ... -
TestNG官方文档中文版(2)-annotation
2008-03-19 23:22 1890TestNG的官方文档的中文翻译版第二章,原文请见 http: ...
相关推荐
#### 1.13 easymock教程-运行时返回值或者异常 在某些情况下,可能希望根据不同的条件返回不同的值或抛出不同的异常。easymock支持运行时动态改变返回值或异常。 - **定义返回值**:使用`andReturn`方法来定义方法...
### 运行时返回值或者异常 * 使用easymock的andReturn方法可以指定返回值。 * 使用easymock的andThrow方法可以指定抛出异常。 ### 改变同一个方法调用的行为 * 使用easymock的andThen方法可以改变同一个方法调用...
##### 1.13 运行时返回值或者异常 - **动态设定返回值**:在测试过程中,可以根据不同的条件设定不同的返回值。 - **模拟异常**:也可以设置某些方法调用时抛出异常。 ##### 1.14 改变同一个方法调用的行为 - **...
这个“easymock教程.zip”包含了帮助你深入理解和使用Easymock的资源,特别是其中的“easymock教程.pdf”。下面将详细阐述Easymock的核心概念、功能以及如何使用它进行单元测试。 1. **什么是Easymock**: ...
EasyMock的工作原理是,它允许开发者指定模拟对象的行为,例如方法调用的返回值、异常或者回调。在测试过程中,这些模拟对象会代替真实的依赖,从而使得测试更加可控。例如,你可以设置一个模拟数据库连接,在特定的...
4. **所需jar包**:这是EasyMock运行所需的库文件。在Java项目中,你需要将这些jar包添加到类路径(classpath)中,以便在代码中引入并使用EasyMock的API。 使用EasyMock进行单元测试的基本流程如下: 1. **创建...
在阅读“easymock教程-easymock的典型使用 - 一个执着的程序员 - 博客频道 - CSDN.NET.html”这篇教程时,应重点关注如何创建和配置模拟对象,理解预设行为和验证的方法,以及如何将EasyMock与Junit结合使用。...
12. **运行时返回值或异常** - 在测试中,可以控制mock对象在特定调用时返回不同的值或抛出异常,模拟各种可能的运行情况。 13. **改变同一个方法调用的行为** - 在不同的调用中,Easymock允许为同一方法设定不同...
3. **配置行为**:通过调用`Expect`方法设置模拟对象的方法行为,包括返回值、异常处理等。 4. **启动录制**:开始记录模拟对象的行为,所有在这个阶段的行为都会被记录下来。 5. **执行测试代码**:在录制期间,...
4. **动态mocking**:除了静态地设置期望,EasyMock 2.4还支持动态mocking,这意味着在运行时可以改变模拟对象的行为。 三、使用步骤 1. **创建模拟对象**:使用`EasyMock.createMock()`方法创建模拟对象。 2. **...
2. 安全的重构支持,即使在运行时修改方法名或参数,测试也不会中断。 3. 支持返回值和异常的设定。 4. 支持检查方法调用的顺序。 缺点: - 要求Java 5.0或更高版本。 - 需要下载额外的扩展包以支持抽象类的模拟。 ...
EasyMock支持动态mocking,这意味着可以在运行时改变模拟对象的行为。这在测试中非常有用,因为可以根据测试需求灵活地调整模拟对象的响应。 **4. 高级特性** - **回调**:使用`doAnswer()`方法,可以指定当方法被...
例如,我们可以设置一个方法在被调用时返回一个特定值,或者在被调用一定次数后抛出异常。 在EasyMock 3.1版本中,引入了一些关键特性: 1. **清晰的API**:EasyMock提供了清晰且易于使用的API,使得设置和验证...
3. **复杂逻辑验证**:对于有复杂条件判断或流程控制的代码,EasyMock可以设置不同的调用顺序和返回值,以便全面检查各种可能的情况。 4. **减少环境影响**:在多线程环境中,模拟对象可以避免因并发问题导致的测试...
8. **类型安全**:EasyMock 2.5.1版可能已经提供了类型安全的API,这使得在编写测试代码时能获得编译时的错误检查,减少运行时错误的可能性。 使用EasyMock进行单元测试可以帮助提高代码质量,减少回归错误,并使...
4. **回调方法**:除了预定义返回值,Easymock还支持使用`EasyMock.callback()`方法定义回调函数,使得mock对象的方法调用可以执行自定义逻辑。 5. **异常测试**:可以设置mock对象抛出预期的异常,以便测试错误...
这时,我们可以使用EasyMock创建B的mock对象,设置其返回值或抛出异常,然后在JUnit测试中使用这个mock对象代替真实的B,从而专注于测试类A的行为。 在文件名称列表`testFromwork`中,可能包含了相关的测试代码示例...
12. **运行时返回值或异常**: 在测试中,你可以控制模拟对象在特定条件下返回特定值,或者在方法调用时抛出异常。 13. **改变同一个方法调用的行为**: 有时,你可能希望同一个方法在不同的调用中有不同的行为,...
这包括方法参数的匹配、返回值设定以及抛出异常的情况。 3. **验证调用**:测试完成后,使用`replay`和`verify`方法来检查Mock对象是否按照预期进行了方法调用。`replay`将Mock对象切换到执行模式,`verify`则检查...
EasyMock 支持多种模拟行为,包括方法调用、返回值设置、异常抛出等。 ### 核心概念 1. **模拟对象(Mock Object)**:EasyMock 创建的模拟对象用于代替真实的依赖,可以预定义其行为和预期调用。 2. **期望...