使用场景:对于调用其它类中的方法,但是还没有编写完,使用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. D2js 的邦联式架构

    d2js 的接口单独看有点像小手工业者,每个人摆弄着自己的小功能,但是在 update 的一声号令下,它们也可以组合起来,发挥出整体的功效,变为流水线上的工人--这一切是自然而隐蔽的进行的,小手工业者 ...

  2. UnixBench-linux下的跑分软件

    UnixBench是一款开源的测试 unix 系统基本性能的工具,是比较通用的测试VPS性能的工具.UnixBench会执行一系列的测试,包括2D和3D图形系统的性能,测试的结果不仅仅是CPU,内存, ...

  3. C# 构建动态树

    public class Tree { public Guid Id { get; set; } public string Url { get; set; } public Guid? Parent ...

  4. Eclipse相关问题

    如何修改Eclipse的 workspace目录 Eclipse是一款很强的Java IDE,我们在开始的时候,往往设定了默认的workspace,当用久在之后,我们可能要去更改一下workspace ...

  5. shanquan2的两年三题系列

    好像只有2个月就退役啦 不管了,先说一下哪三题:多点求值.lcm.替罪羊树(bzoj3065) [upd0]2016.3.29 多点求值A掉啦,myy卡常数sxbk(不是说好的是shanquan2出的 ...

  6. 操作系统课程设计--Linux平台哲学家问题

    哲学家问题是操作系统中资源分配的经典问题 linux平台下的系统api不同于Windows下的实现 要求:一个正确的哲学家程序(不会发生死锁) 一个错误的哲学家程序(会发生死锁) 系统环境:Eleme ...

  7. 面向对象Part4

    ---------------------------------------------------------------------------------------------------- ...

  8. eclipse开发servlet,HttpServletRequest报红叉解决方案

    eclipse开发servlet,HttpServletRequest报红叉解决方案 今天突然间有兴致,想打一会代码,于是开发一个Servlet,代码和配置路径都没问题,HttpServlet居然报错 ...

  9. 安装JBOSS

    下载JBOSS 无需安装 修改环境变量: JBOSS_HOME=/root/jboss-as-7.1.1.Finalexport JBOSS_HOME 进入bin下 ./standalone.sh - ...

  10. 初识MVC

    本人是一个程序员,我也是一个很普通很普通的人,当我初学一些东西的时候感觉都很难,毕竟没有天才的头脑,没有高等的学历,但是我有的只是努力,只是拼搏的精神,人都是为自己而活,也可能为他人而活,但是有时候在 ...