- 浏览: 583241 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (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 5704前面的教程中,我们看到easymock可以通过 ... -
easymock教程-改变同一个方法调用的行为
2010-11-30 17:06 3338在easymock中,对于mock对象的同一个方法,可 ... -
easymock教程-自定义参数匹配器
2010-11-30 18:18 4064虽然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教程-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 2885easymock中提供对于类的mock功能,我们可以方 ... -
easymock教程-mock和stub
2010-08-26 15:26 5916作为测试的基本概念,在开发测试中经常遇到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 1788最近决定开始使用TestNG ... -
TestNG官方文档中文版(2)-annotation
2008-03-19 23:22 1890TestNG的官方文档的中文翻译版第二章,原文请见 http: ...
相关推荐
#### 1.9 easymock教程-创建stub对象 除了创建mock对象外,easymock还支持创建stub对象。stub对象主要用于模拟简单的行为,如返回固定的值或抛出异常。 - **创建stub对象**:可以使用`EasyMock.createStub`方法来...
* 使用easymock的createStub方法创建Stub对象。 * 使用Stub对象可以模拟真实对象的部分行为。 ### 放宽调用次数 * 使用easymock的anyTimes方法可以放宽调用次数的限制。 ### 参数匹配 * 使用easymock的eq方法...
8. **创建Stub对象** - 通过Easymock,你可以为方法设定返回值或抛出异常,创建一个简单的Stub,用于满足特定的测试场景。 9. **放宽调用次数** - Easymock允许设定方法调用的最小和最大次数,这在处理不确定调用...
- **行为控制**:Stub对象的方法通常会有具体的实现逻辑,即使是非常简单的返回值或抛出异常。Mock对象的方法行为则是通过测试代码来控制的,例如设置预期的方法调用次数、参数等。 ##### 1.2 单元测试中的主要...
8. **创建Stub对象**: 创建Stub可以设定一个方法总是返回相同的结果,无论何时被调用,这在你不需要验证调用,但需要控制返回值时非常有用。 9. **放宽调用次数**: 默认情况下,EasyMock期望的方法调用次数必须...
2. **Mock和Stub的区别**:Mock对象会在测试后验证它被调用的方式,而Stub对象只返回预定义的值,不进行任何验证。 3. **测试DAO**:讲解如何使用Easymock模拟数据库操作,比如预设查询、插入、更新或删除的方法...
在Java中,可以使用Mockito、EasyMock等库来创建桩对象,使得测试更加可控和隔离。 单元测试的步骤通常包括: - **设置(Setup)**:在每个测试开始前,准备必要的测试环境,如初始化数据、创建对象等。 - **执行...
即时模拟是指在运行时创建对象或模拟行为,这在测试某些复杂的依赖关系或无法正常构造的对象时非常有用。 "参考" 一词意味着这个压缩包可能包含了一些外部链接或者参考文档,这些文档可能提供了更深入的理论知识和...
Java单元测试对于开发人员质量保证至关重要,尤其当...Mock说白了就是打桩(Stub)或则模拟,当你调用一个不好在测试中创建的对象时,Mock框架为你模拟一个和真实对象类似的替身来完成相应的行为。使用如下方式在Mav
9. **假对象(Mocks)与桩(Stubs)**:在单元测试中,有时需要模拟(mock)或替身(stub)外部依赖,JUnit 本身不提供这个功能,但可以结合使用 Mockito 或 EasyMock 这样的库来实现。 10. **测试驱动开发(TDD)*...
3. **Mocking和Stubbing**:在单元测试中,有时需要模拟(mock)或存根(stub)依赖对象的行为,以隔离测试。Java社区有Mockito、EasyMock和PowerMock等工具来实现这一目的。 4. **集成测试**:对于涉及数据库、...
7. **假对象和Mocking**:在JUnit测试中,经常需要模拟(mock)或桩(stub)其他依赖对象,以隔离被测试的代码。JUnit本身并不提供模拟功能,但可以与其他库如Mockito或EasyMock结合使用。 8. **测试驱动开发(TDD...
3. **Mocking和Stubbing**: 在复杂的系统中,有时需要模拟(mock)或存根(stub)依赖对象的行为,以隔离测试并专注于待测试代码的功能。Java社区有多个库可用于此目的,如Mockito和EasyMock。通过mocking,我们可以...