使用场景:对于调用其它类中的方法,但是还没有编写完,使用easymock进行单元测试,它提供这些没有编写完的代码期待的默认值。

使用步骤

step1:

pom引入:

         <dependency>
<groupId>org.easymock</groupId>
<artifactId>easymock</artifactId>
<version>3.2</version>
</dependency>
<dependency>
<groupId>org.easymock</groupId>
<artifactId>easymockclassextension</artifactId>
<version>3.2</version>
</dependency>
<dependency>
<groupId>org.easymock</groupId>
<artifactId>com.springsource.easymockclassextension</artifactId>
<version>3.2</version>
</dependency>

2、使用easymock中的方法编写单元测试

第一,创建mocks的类

需要注意的是:一般使用EasyMock.createMock创建mock对象,但是一些对象需要set一些值,这时候我们可以使用EasyMock.createNiceMock

第二,开始录制

第三,mock回放

需要注意的是:只能回放用mock创建的对象,比如new出来的对象就不能回放;

第四,使用

测试单元:

     /**
* 使用easymock测试GetTotalAmount
* @throws ParseException
*/
@Test
public void testGetTotalAmount() throws ParseException {
Reconciliation reconciliation = EasyMock
.createMock(Reconciliation.class);
Date endTime = new Date();
Date startTime = new Date(); Calendar calendar = Calendar.getInstance();
calendar.setTime(endTime);
calendar.add(Calendar.DATE, -1);
startTime = calendar.getTime();
EasyMock.expect(reconciliation.getReconciliationStartTime())
.andReturn(startTime);
// TODO 1
EasyMock.expectLastCall().anyTimes();
EasyMock.expect(reconciliation.getReconciliationEndTime())
.andReturn(endTime);
EasyMock.expectLastCall().anyTimes();
// TODO 2
reconciliation.setReconciliationStartTime(
sdf.parse(reconciliationStartTimeFormat.format(startTime)));
EasyMock.expectLastCall().anyTimes();
reconciliation.setReconciliationEndTime(
sdf.parse(reconciliationEndTimeFormat.format(endTime)));
EasyMock.expectLastCall().anyTimes();
reconciliation.setStatus((byte) 1);
EasyMock.replay(reconciliation);
QueryParameters queryParameters = new QueryParameters();
queryParameters.setPage(1);
queryParameters.setRows(PAGESIZE);
ModelMap model = EasyMock.createMock(ModelMap.class);
// TODO 3
model.clear(); EasyMock.expect(model.addAttribute("totalAmount", new Double(0)))
.andReturn(model);
EasyMock.expectLastCall().anyTimes(); EasyMock.expect(model.addAttribute("total", new Integer(0)))
.andReturn(model);
EasyMock.expectLastCall().anyTimes();
EasyMock.replay(model);
reconciliationController.getTotalAmount(reconciliation, queryParameters,
model);
}
/**
* 测试GetTotalAmount
* @throws ParseException
*/
@Test
public void testGetTotalAmount1() throws ParseException {
Reconciliation reconciliation = new Reconciliation();
Date endTime = new Date();
Date startTime = new Date(); Calendar calendar = Calendar.getInstance();
calendar.setTime(endTime);
calendar.add(Calendar.DATE, -1);
startTime = calendar.getTime();
reconciliation.setReconciliationStartTime(startTime);
reconciliation.setReconciliationEndTime(endTime);
reconciliation.setStatus((byte) 1);
QueryParameters queryParameters = new QueryParameters();
queryParameters.setPage(1);
queryParameters.setRows(PAGESIZE);
ModelMap model = new ModelMap();
reconciliationController.getTotalAmount(reconciliation, queryParameters,
model);
}

被测单元:

/**
* 运营审核--结算
*/
@RequestMapping("/getTotalAmount")
public void getTotalAmount(Reconciliation reconciliation,
QueryParameters queryParameters, ModelMap model) {
try {
if (reconciliation.getReconciliationStartTime() == null) {
logger.info("对账时没有选择对账开始时间!");
} else if (reconciliation.getReconciliationEndTime() == null) {
logger.info("对账时没有选择对账截止时间!");
} else if (reconciliation.getReconciliationEndTime()
.before(reconciliation.getReconciliationStartTime())) {
logger.info("对账时,对账截止时间早于对账开始时间!");
} else {
// 格式化日期时间
reconciliation.setReconciliationStartTime(
sdf.parse(reconciliationStartTimeFormat.format(
reconciliation.getReconciliationStartTime())));
reconciliation.setReconciliationEndTime(
sdf.parse(reconciliationEndTimeFormat.format(
reconciliation.getReconciliationEndTime()))); // reconciliations =
// reconciliationManager.getReconciliation(reconciliationShopId,
// reconciliationStartTime, reconciliationEndTime,status);
}
} catch (Exception e) {
logger.error(e.getMessage());
}
model.clear();
final Parameter[] parameters = ObjectToParam
.getObjectInfo(reconciliation);
double totalAmount = reconciliationManager
.queryReconciliationTotalAmount(parameters);
int total = reconciliationManager.queryReconciliationCount(parameters);
model.put("totalAmount", totalAmount);
model.put("total", total);
}

上面的easymock的使用场景是在:知道参数的类型,但不知道参数的具体的值,但这种方式相对下面没有使用easymock的要麻烦的多,不占优势。

但是当被调用的方法没有编写完可以使用easymock赋一个固定的值,比如下面的代码:

 /**
* easyMock测试更新
*
* @throws ParseException
*/
@Test
public void testuppdateReconciliation() throws ParseException {
IReconciliationManager reconciliationManager = EasyMock.createMock(IReconciliationManager.class);
Reconciliation reconciliation = new Reconciliation();
String reconciliationId="";
byte status = (byte);
ModelMap model = new ModelMap();
EasyMock.expect(reconciliationManager.updateReconciliationStatus(reconciliation)).andReturn(false);
EasyMock.replay(reconciliationManager);
reconciliationController.getReconciliation(reconciliationId, status, model);
}

3、在写代码的时候遇到的问题

问题1:mock被多次调用需要使用EasyMock.expectLastCall().anyTimes(),否则有下列错误

java.lang.AssertionError:
Unexpected method call Reconciliation.getReconciliationEndTime():
Reconciliation.getReconciliationEndTime(): expected: 1, actual: 2

问题2:使用get填充之后,还需要使用mock填充set

java.lang.AssertionError:
Unexpected method call Reconciliation.setReconciliationStartTime(Thu Sep 22 00:00:00 CST 2016):
at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:44)

问题3:map返回值多余一个

java.lang.IllegalStateException: missing behavior definition for the preceding method call:
ModelMap.put("totalAmount", 0.0)
Usage is: expect(a.foo()).andXXX()

相关讨论

参考文档:http://outofmemory.cn/code-snippet/2370/java-danyuan-test-easyMock-usage-summary

    http://www.educity.cn/se/619486.html

测试--easymock的使用的更多相关文章

  1. 模拟对象测试——EasyMock

    一.EasyMock 使用动态代理实现模拟对象创建,一般可以满足以下测试需求 1.要测试的模块依赖于其它自己控制不了的模块,如第三方服务,其它组员在开发的服务等,它们都没办法配合你来测试: 2.涉及到 ...

  2. EasyMock 模拟对象测试

    一.EasyMock 使用动态代理实现模拟对象创建,一般可以满足以下测试需求 1.要测试的模块依赖于其它自己控制不了的模块,如第三方服务,其它组员在开发的服务等,它们都没办法配合你来测试: 2.涉及到 ...

  3. easymock所测试的方法内部新NEW对象的处理

    问题:当记录的方法的参数是方法所在类内部新NEW的对象时,静态的记录方法交互就会失效,例如 调用的方法: public calss A{ public void method(User u){ u.s ...

  4. 使用 EasyMock 更轻松地进行测试

    from:http://www.ibm.com/developerworks/cn/java/j-easymock.html 测试驱动开发是软件开发的重要部分.如果代码不进行测试,就是不可靠的.所有代 ...

  5. 使用EasyMock对Servlet进行简单的测试

    这是一个WebProject,但不需配置web.xml,因为EasyMock用不上它 首先是用到的实体类User.java package com.jadyer.model; public class ...

  6. 08.利用Easymock测试简单的servlet

    1.首先导入需要使用的servlet的jar包 接下来我们编写一个登陆的servlet package com.fjnu.service; import java.net.HttpRetryExcep ...

  7. 利用EasyMock生成数据库连接简单测试示例

    package demo.mock; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.Re ...

  8. [翻译]写给精明Java开发者的测试技巧

    我们都会为我们的代码编写测试,不是吗?毫无疑问,我知道这个问题的答案可能会从 “当然,但你知道怎样才能避免写测试吗?” 到 “必须的!我爱测试”都有.接下来我会给你几个小建议,它们可以让你编写测试变得 ...

  9. Android高手速成--第四部分 开发工具及测试工具

    第四部分 开发工具及测试工具 主要介绍和Android开发工具和测试工具相关的开源项目. 一.开发效率工具 Json2Java根据JSon数据自动生成对应的Java实体类,还支持Parcel.Gson ...

随机推荐

  1. informatica读取FTP文件

    以下为一个完整的informatica读取ftp文件,并导入到系统中. 第一步: 通过shell脚本下载压缩包文件 /server/infa_shared/crm_prod/shell/ftpFrom ...

  2. 07-本地 YUM 源制作

    1.YUM相关概念 1.1.什么是YUM YUM(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器.基 ...

  3. Linux中检索文件

    1 , Use locate command It is a fast way to find the files location, but if a file just created ,it w ...

  4. C# WinForm实现Windows 7 Aero磨砂玻璃效果

    在Vista系统之后,微软为窗体程序提供了Aero磨砂的效果,如下图.那么用C#如 何来实现这种磨砂效果呢? 代码: using System; using System.Collections.Ge ...

  5. JSON 的标准:双引号而非单引号!

    刚刚测试发现一段很简单的.看似正确的代码却是错误的: <?php $json_str = "{'name':'Eric', 'age':23}"; var_dump(json ...

  6. Bootstrap 中的 Typeahead 组件 -- AutoComplete

    Bootstrap 中的 Typeahead 组件就是通常所说的自动完成 AutoComplete,功能很强大,但是,使用上并不太方便.这里我们将介绍一下这个组件的使用. 第一,简单使用 首先,最简单 ...

  7. git: fatal: Not a git repository (or any of the parent directories): .git

    在看书 FlaskWeb开发:基于Python的Web应用开发实战 时,下载完源码后 git clone https://github.com/miguelgrinberg/flasky.git 试着 ...

  8. 出售Illustrator脚本插件面板(包含面板源码,以及面板上所有的功能源码)

    出售Illustrator脚本插件面板(包含面板源码,以及面板上所有的功能源码) 购买后可提供相应的小修改,以及教你使用往这个多列面里再加上按钮功能! 这套源码可作为工作使用,也可用为新手学习AI脚面 ...

  9. toArray(),toJson(),hidden([ ]),visible([ ])

    toArray() 转换为数组,hidden()不输出的字段 public function index(){ $user = model('User'); $data = $user::)-> ...

  10. 响应者链条,如何获取最佳的点击view 以及内部实现

    事件的产生与传递 事件是如何产生与传递的? 当发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中. UIApplication会从时间队列中取出最前面的时间,并将事件 ...