使用场景:对于调用其它类中的方法,但是还没有编写完,使用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. 基于Spring AOP的JDK动态代理和CGLIB代理

    一.AOP的概念  在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的 ...

  2. asp.net mvc使用log4gNetz

    1. 下载安装log4gNet 2. 将 \bin\net\4.0\release\log4net.dll 复制到你的项目中 . 3. 将log4net.dll 添加引用到你的项目中. 4. 添加如下 ...

  3. Json.net日期格式化

    1. 全局设置,可以在App_Global中配置 JsonSerializerSettings setting = new JsonSerializerSettings(); JsonConvert. ...

  4. java模拟post请求发送json

    java模拟post请求发送json,用两种方式实现,第一种是HttpURLConnection发送post请求,第二种是使用httpclient模拟post请求, 方法一: package main ...

  5. Jni :三维数组处理方法 ,以整形三维数组为例 C++实现

    本文原创,转载请注明地址:http://www.cnblogs.com/baokang/p/4982846.html 关于Jni的基本使用方法,请参阅:Java 调用 C++ (Java 调用 dll ...

  6. httpie 取代 curl

    接口测试有人喜欢postman(for windows or mac) 如果长期用linux工作,可能更喜欢命令的方式,比如curl最近深入了解了下django-rest-framwork,他们推荐了 ...

  7. tengine/nginx-tomcat动静分离遇到的问题

    小站安装好tengine后,接下来的工作就是要配置好tengine让其和后端的tomcat正常的连接工作起来,tengine的配置文件本身比较简单,网上有大量的相关介绍说明文档,我这里只是摘出我配置过 ...

  8. -bash: fork: retry: Resource temporarily unavailable

    登陆不了服务器The server refused to start a shell. 登陆服务器后执行ls命令报错:   1 2 $ls -bash: fork: retry: Resource t ...

  9. Selenium FF WebDriver 加载firebug 和设置代理

    首先这次使用的webDriver for Firefox的 由于项目的原因,需要在测试的时候加载Firebug和使用vpn,加载代理 Firefox 加载代理,可以从FF菜单上看,代理分为好几种 我这 ...

  10. iOS 局部变量 全局变量 成员变量

    一.成员变量 : 写在类声明的大括号中的变量叫成员变量 (也叫属性/实例变量) 成员变量不可离开类 离开了类就不是成员变量 成员变量不能再定义的同事初始化 成员量只能通过对象来访问 成员变量存储在堆中 ...