`
bluepopopo
  • 浏览: 92342 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

EasyMock 使用点滴

阅读更多
稍稍记录一下EasyMock的使用。

废话没有,单元测试一般都会用XUnit测试框架。简单对象或方法还好,倘若出现复杂对象依赖那么光是准备依赖对象就够喝一壶的了。譬如要测试
Class_A.method(Class_B obj){...}
Class_B depends Class_C.

Mock对象便出马了,其实就是基于动态代理机制产生Class_B/Class_C的实例。听说过JMock,EasyMock,MockEJB等等,目前尝试过的只有EasyMock.下面开始。

从EasyMock站点下载发行包,我使用的是easymock-2.5.2。使用很简单,查看user guide就可以上手了。

EasyMock默认只能创建基于Interface的mock对象,如
EasyMock.createMock(DataManagerInterface.class);
.若要能够mock具类,则要使用扩展包 classextension,如
org.easymock.classextension.EasyMock.createMock(DataManagerConcret.class)

一点提示,使用classextension时还需要下载objenesis-1.2.jar,文档里面没有提到不过网上有的下。在我看来,具类测试使用比较频繁。

创建完之后,则是设定mock对象的状态。EasyMock将mock对象分为录制,回放(replay)两个阶段。刚开写的时候,以为poConsumption1里面的属性还需要自己创建,
poConsumption1.setId(dbId1)
poConsumption1.setCategoryrow(Category1)
poConsumption1.setName(rowName1)
poConsumption1.setPrice(rowPrice1)

其实下面才是mock对象能够设定的属性,
//create mock object
POConsumption poConsumption1 = EasyMock.createMock(POConsumption.class);
// record invocation state
EasyMock.expect(poConsumption1.getId()).andReturn(dbId1);//expect getId return dbId1	
EasyMock.expect(poConsumption1.getCategory()).andReturn(rowCategory1);
EasyMock.expect(poConsumption1.getName()).andReturn(rowName1);
EasyMock.expect(poConsumption1.getPrice()).andReturn(rowPrice1);

接着便是回放阶段,
		// switch to the replay state
		EasyMock.replay(poConsumption1);

调用业务逻辑,
// put them into the list
List<POConsumption> list = new ArrayList<POConsumption>();
list.add(poConsumption1);
// call business function
RowData[] rowDataAray = utility.convertToRowDataArray(list);
// assumption
assertEquals(list.size(), rowDataAray.length);


如果convertToRowDataArray()里面调用到了POConsuumption的其他方法,那么将会throw exception:Unexpected method invocation,因为这个方法不是预期调用的(没有录制)。

如果在最后加上
EasyMock.verify(poConsumption1);

则意味着录制的所有方法都必须被convertToRowDataArray()调用到,否则fail.

真是够简单。IBM developerWorks上有一篇很好的文章关于EasyMock框架的原理和使用,so far so good.

顺便提及dao的测试,我本人觉得没有必要,CRUD有必要费老大劲来单元测试吗?去mock数据存储?如果架构合理,高度模块化,复杂的业务逻辑测试才是mock对象用武之地。
1
1
分享到:
评论
1 楼 lonvea 2010-06-08  
写的不错,不过最后几句话,我就不太苟同了,DAO测试是必须的,这是验证数据库操作正确性的最近的防线..

相关推荐

    EasyMock 使用案例(含lib)

    在这个"EasyMock 使用案例(含lib)"中,我们将会深入探讨如何利用EasyMock进行Java单元测试,并通过具体的例子——EasyMockDemo来讲解其用法。 首先,EasyMock的基本理念是让你能够定义模拟对象的行为,比如它应该...

    easymock2.4+EasyMock使用简明手册.pdf

    EasyMock是Java编程中的一款强大的模拟框架,它允许开发者在单元测试中创建和控制...通过阅读《EasyMock使用简明手册》和解压后的easymock2.4.zip文件,开发者可以深入理解并掌握如何有效地使用EasyMock进行单元测试。

    EasyMock介绍和使用

    【EasyMock使用方法】 1. **创建模拟对象**:首先,需要通过`EasyMock.createMock()`方法创建模拟对象,指定需要模拟的接口。 2. **预设行为**:使用`expect()`方法设定模拟对象的方法调用应如何响应,例如返回...

    EasyMock 使用方法与原理剖析

    EasyMock单元测试的扩展; EasyMock简介(抽象类接口做测试); EasyMock来进行测试; EasyMock如何打桩;...EasyMock使用技巧; EasyMock使用简明手册; EasyMock使用说明; EasyMock使用手记; 用Mock object进行隔离测试;

    easymock的使用,含demo

    本文将对 EasyMock 的功能和原理进行介绍,并通过示例来说明如何使用 EasyMock 进行单元测试。 Mock 方法是单元测试中常见的一种技术,它的主要作用是模拟一些在应用中不容易构造或者比较复杂的对象,从而把测试与...

    EasyMock

    在实际使用EasyMock时,我们通常会遵循以下步骤: 1. **创建模拟对象**:首先,你需要通过`EasyMock.createMock()`方法创建一个模拟对象。例如,如果你有一个名为`MyInterface`的接口,你可以这样创建它的模拟对象...

    EasyMock 使用方法与原理剖析.rar

    本文将深入探讨EasyMock的使用方法及其工作原理,帮助开发者更好地理解和运用这一工具。 ### EasyMock的基本概念 - **模拟对象(Mock Object)**:在测试中,模拟对象是替代真实对象的类,它会根据预定义的行为来...

    easyMock

    - **创建模拟对象**:你可以使用`EasyMock.createMock()`方法创建一个模拟对象,然后通过`EasyMock.replay()`进入“播放”模式,让模拟对象按照预期执行。 - **设置预期**:使用`expect()`方法设置对模拟对象的期望...

    EasyMock与Mockito 使用

    EasyMock和Mockito是两个广泛使用的Java模拟框架,它们可以帮助开发者在隔离环境中测试代码,避免了依赖其他组件或服务的复杂性。本文将详细介绍这两个工具的使用方法、原理和差异。 **EasyMock** EasyMock是一个...

    easymock-3.2.zip

    例如,使用`@Before`注解设置测试前的准备工作,使用`@Test`注解定义测试方法,并在其中使用EasyMock的API进行模拟和验证。 总之,EasyMock 3.2 提供了一个强大而灵活的模拟工具,帮助开发者编写高质量的单元测试,...

    easymock.jar,easymockclassextension.jar

    2. **创建模拟对象**:使用Easymock的`createMock`或`createNiceMock`方法创建模拟对象。 3. **设置预期**:通过`expect`方法设定模拟对象的方法调用预期。 4. **启动测试**:调用`replay`方法开始执行模拟。 5. ...

    EasyMock 3.1相关jar(所有)

    还在为EasyMock使用时出异常而烦恼? 本压缩包包含除了Junit4之外easyMock3.1所用到的所有相关jar包,junit4可自己导入eclipse自带的即可 本压缩包包括: asm.jar cglib.jar objenesis.jar等 其中asm与cglib已兼容,放心...

    EasyMock的安装与部署所需全部文件.zip

    为了部署和使用EasyMock,你需要将源码导入一个支持Java开发的IDE(如Eclipse或IntelliJ IDEA),然后按照提供的说明进行编译和配置。 在部署流程中,一般步骤如下: 1. 安装Node.js:访问官网下载Windows安装包,...

    easymock资料和源代码实例

    **Easymock使用示例** 1. **导入库**:首先,在项目中引入Easymock库,通常通过Maven或Gradle等构建工具完成。 2. **创建模拟对象**:使用`EasyMock.createMock()`方法创建模拟对象,如`MyInterface mockObject = ...

    EasyMock 实例

    5. **验证行为**:测试完成后,使用`EasyMock.verify()`方法检查模拟对象是否按照预期被调用了。这有助于确保你的代码正确地使用了模拟对象。 ```java EasyMock.verify(myServiceMock); ``` 6. **清理资源**:...

Global site tag (gtag.js) - Google Analytics