测试--easymock的使用
使用场景:对于调用其它类中的方法,但是还没有编写完,使用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的使用的更多相关文章
- 模拟对象测试——EasyMock
一.EasyMock 使用动态代理实现模拟对象创建,一般可以满足以下测试需求 1.要测试的模块依赖于其它自己控制不了的模块,如第三方服务,其它组员在开发的服务等,它们都没办法配合你来测试: 2.涉及到 ...
- EasyMock 模拟对象测试
一.EasyMock 使用动态代理实现模拟对象创建,一般可以满足以下测试需求 1.要测试的模块依赖于其它自己控制不了的模块,如第三方服务,其它组员在开发的服务等,它们都没办法配合你来测试: 2.涉及到 ...
- easymock所测试的方法内部新NEW对象的处理
问题:当记录的方法的参数是方法所在类内部新NEW的对象时,静态的记录方法交互就会失效,例如 调用的方法: public calss A{ public void method(User u){ u.s ...
- 使用 EasyMock 更轻松地进行测试
from:http://www.ibm.com/developerworks/cn/java/j-easymock.html 测试驱动开发是软件开发的重要部分.如果代码不进行测试,就是不可靠的.所有代 ...
- 使用EasyMock对Servlet进行简单的测试
这是一个WebProject,但不需配置web.xml,因为EasyMock用不上它 首先是用到的实体类User.java package com.jadyer.model; public class ...
- 08.利用Easymock测试简单的servlet
1.首先导入需要使用的servlet的jar包 接下来我们编写一个登陆的servlet package com.fjnu.service; import java.net.HttpRetryExcep ...
- 利用EasyMock生成数据库连接简单测试示例
package demo.mock; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.Re ...
- [翻译]写给精明Java开发者的测试技巧
我们都会为我们的代码编写测试,不是吗?毫无疑问,我知道这个问题的答案可能会从 “当然,但你知道怎样才能避免写测试吗?” 到 “必须的!我爱测试”都有.接下来我会给你几个小建议,它们可以让你编写测试变得 ...
- Android高手速成--第四部分 开发工具及测试工具
第四部分 开发工具及测试工具 主要介绍和Android开发工具和测试工具相关的开源项目. 一.开发效率工具 Json2Java根据JSon数据自动生成对应的Java实体类,还支持Parcel.Gson ...
随机推荐
- EBS中利用Socket与外系统通信
某银行要求做一个签到签退功能,日终EBS系统发送报文与核心系统对帐,规定利用Socket来做传送,记录下步骤: 1.编辑: $INST_TOP/ora/10.1.3/j2ee/oacore/appli ...
- 改变win7驱动图标
一.背景 自己做的USB设备是HID设备,注册到设备管理器中就是"HID Compliant device",显得很业余,然后想去改变这个图标和名称,也就有了此篇文章 二.正文 还 ...
- oracle 关于null值排序
在oracle中根据字段来desc排序的话null值可能会在数据的最前面.然而有时候我们查看数据的时候并不希望能够在前面看到这些null值的排序数据. 因此我查了一下: 1.排序的时候运用nvl(). ...
- gd库
1.开启GD库扩展 去掉注释: extension=php_gd2.dll extension_dir='ext目录所在位置' 2.检测GD库是否开启 phpinfo(); //检测扩展是够开启 ex ...
- BZOJ 3784: 树上的路径
Description 问一棵树上前 \(k\) 大路径的边权. Sol 边分治. 非常感谢数据没有菊花图. 为了写写边分治试试然后就开了这道题. 边分治非常好想,选一条重边,分成两部分,然后分别求最 ...
- set使用方法
set 添加一个无序的,用set方法,访问速度快,天生解决了重复问题 1.difference 指定某个元素从原来set取出,并生成新的set #difference a = set(["a ...
- 让IE8支持placeholder
$(function(){ if(!placeholderSupport()){ // 判断浏览器是否支持 placeholder $('[placeholder]').focus(function( ...
- Unity3D 解决用Unity导出的Android工程在6.0及以上设备会弹出一串权限对话框的问题
解决用Unity导出的Android工程在6.0及以上设备会弹出一串权限对话框的问题 <meta-data android:name="unityplayer.SkipPermissi ...
- RecyclerView解密篇(一)
一.前言 RecyclerView是谷歌V7包下新增的控件,用来替代ListView的使用,在RecyclerView标准化了ViewHolder类似于ListView中convertView用来做视 ...
- 如何正确的做WEB端的压力测试
1.对要测试的系统进行分析,明确需要对哪一块做压力测试.比如:淘宝网站双十一期间,秒杀跟支付,此模式用户操作中占比比较大 再比如:游戏,登录--开始战斗--结束战斗这种混合模式在用户操作中占比较大 那 ...