使用场景:对于调用其它类中的方法,但是还没有编写完,使用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. 增量式PID推导及C语言实现

    PID控制器表达式为: \[ u(t) = K_pe(t) + K_i\int_0^t e(\tau)d\tau + K_d\frac{de(t)}{dt} \] 离散化: 令 $ t = nT,~T ...

  2. 让用VS2013编写的程序在XP中顺利运行

    vs2013编译好的exe文件拖到虚拟机xp中无法运行,提示错误,从网上搜索.找答案. 参考:http://blog.csdn.net/asanscape/article/details/387526 ...

  3. react+redux官方实例TODO从最简单的入门(1)-- 前言

    刚进公司的时候,一点react不会,有一个需求要改,重构页面!!!完全懵逼,一点不知道怎么办!然后就去官方文档,花了一周时间,就纯react实现了页面重构,总体来说,react还是比较简单的,由于当初 ...

  4. BZOJ 3527: [Zjoi2014]力

    Description 求 \(E_i=\sum _{j=0}^{i-1} \frac {q_j} {(i-j)^2}-\sum _{j=i+1}^{n-1} \frac{q_j} {(i-j)^2} ...

  5. SqlServer 2008登录时报错

    登录SQLServer2008R2时提示如下错误: 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误.未找到或无法访问服务器.请验证实例名称是否正确并且 SQL Server ...

  6. CentOS7 NTP 安装配置

    NTP 网络时间协议用来同步网络上不同主机的系统时间.你管理的所有主机都可以和一个指定的被称为 NTP 服务器的时间服务器同步它们的时间.而另一方面,一个 NTP 服务器会将它的时间和任意公共 NTP ...

  7. wpf 悬浮窗口的实现

    又到了写点东西的时候,因为有了新的收获,所以用随笔来记录下自己的成长.话不多说,正入主题. 最近又遇到一个新的需求,有一组控件,需要悬浮显示在面板的边缘上,刚开始的时候,是不显示的,点击后显示,然后再 ...

  8. thinkphp导入导出excel表单数据

    在PHP项目经常要导入导出Excel表单. 先去下载PHPExcel类库文件,放到相应位置. 我在thinkphp框架中的位置为ThinkPHP/Library/Org/Util/ 导入 在页面上传e ...

  9. Ubuntu下安装JDK以及相关配置

    1.查看系统位数,输入以下命令即可 getconf LONG_BIT 2.下载对应的JDK文件,我这里下载的是jdk-8u60-linux-64.tar.gz 3.创建目录作为JDK的安装目录,这里选 ...

  10. Delphi的分配及释放---New/Dispose, GetMem/FreeMem及其它函数的区别与相同

    转载自:http://www.cnblogs.com/qiusl/p/4028437.html?utm_source=tuicool 我估摸着内存分配+释放是个基础的函数,有些人可能没注意此类函数或细 ...