使用EasyMock的总体步骤

1、生成Mock接口

  1. IService mockService = EasyMock.createMock("name", IService.class);

如果要mock对象,而不是接口,应该使用class extension:org.easymock.classextension.EasyMock

如果要mock多个接口,最好使用MockControl来管理:

  1. IMocksControl control = EasyMock.createControl();
  2. IService1 mockObj1 = control.createMock(IService1.class);
  3. IService2 mockObj2 = control.createMock(Iservice2.class);

2、设置预期行为

如果返回值是void:

  1. mockService.doVoidMethod();
  2. EasyMock.expectLastCall();// 最新版本的EasyMock可以忽略此句

如果要求抛出异常:

  1. EasyMock.expectLastCall().andThrow(
  2. new MyException(new RuntimeException())).anyTimes();

如果返回值不是void:

  1. EasyMock.expect(mockService.doSomething(isA(Long.class), isA(Report.class),
  2. isNull(Report.class))).andReturn("return string").anyTimes();

上例方法中传入3个参数,分别是Long、Report、null——注意,如果参数是基本类型long,则使用EasyMock.anyLong()

传入参数还可以定义为具体的对象,而不是类。

3、将Mock对象切换到replay状态

  1. EasyMock.replay(mockService);

如果是用MockControl来管理:

  1. control.replay();

4、测试

  1. bo.setService(mockService);
  2. bo.doSomething();

5、验证Mock对象的行为

  1. EasyMock.verify(mockService);

如果是用MockControl来管理:

  1. control.verify();

expect()注意事项

期望传入参数为基本类型时

用expect来设置mock方法的期望调用方式时,如果使用到基本类型,但是又不要基本类型的值,

不能用:EasyMock.isA(Long.class)

要用:EasyMock.anyLong()

期望传入参数可能为null时

如果传入的参数可能为null,如果用

  1. isA(String.class)

而实际传入的是null,则会报错 (isA(java.lang.String), <any>): expected: 1, actual: 0

应该用:

  1. or(isA(String.class), isNull())

如果返回结果在运行时才能确定

很可能某个方法期望的返回结果不是固定的,例如根据传入参数不同而不同;这时需要使用andAnswer():

  1. EasyMock.expect(mockService.execute(EasyMock.anyInt())).andAnswer(new IAnswer<Integer>() {
  2. public Integer answer() throws Throwable {
  3. Integer count = (Integer) EasyMock.getCurrentArguments()[0];
  4. return count * 2;
  5. }
  6. });

注意,通过EasyMock.getCurrentArguments()可以获取传入参数!

times()

常见问题

java.lang.IllegalStateException: 2 matchers expected, 1 recorded.

可能是设置mock方法的期望调用方式时,既使用了isA的方式来指定参数,又使用了一个具体值来作为参数

比如这样写:

  1. expect(mockEmployeeRepository.findByDepartmentAndSpecification("HR",
  2. isA(EmployeeSearchSpecification.class)).andReturn(emplooyees);

正确的写法:——用eq(具体值)

    1. expect(mockEmployeeRepository.findByDepartmentAndSpecification(eq("HR"),
    2. isA(EmployeeSearchSpecification.class)).andReturn(employees);

【JUnit】EasyMock用法总结的更多相关文章

  1. 关于intellij IDEA 上junit的用法

    话说,最近正在看视频学java.里面有个叫做junit的东西很有用.但是实话说我摆弄了半天都没弄明白. 今天呢通过一些资料,终于弄清楚了junit的大致用法,这里写出来,用以分享和备忘. 首先,环境和 ...

  2. JUnit基本用法

    JUnit的一些注意事项: 测试方法必须使用@Test修饰 测试方法必须使用public void进行修饰,不能带参数 一般使用单元测试会新建一个test目录存放测试代码,在生产部署的时候只需要将te ...

  3. Wiser的Junit测试用法

    package org.jbpm.process.workitem.email; import static org.junit.Assert.assertEquals; import static ...

  4. java的Junit的用法(转发)

    初级https://blog.csdn.net/andycpp/article/details/1327147/ 中级https://blog.csdn.net/andycpp/article/det ...

  5. JUNIT的用法简要总结

    JUNIT是一个单元测试框架,可以用来测试我们程序中的某个模块是否工作正常.而不需要去写一个MAIN函数来测试,方便快捷. 经过对博客http://blog.csdn.net/andycpp/arti ...

  6. EasyMock入门

    这是一个JavaProject,有关EasyMock用法详见本文测试用例 首先是用到的实体类User.java package com.jadyer.model; public class User ...

  7. JUnit3 结合一个除法的单元测试说明Assert.fail()的用法

    之前一篇博文(JUnit基础及第一个单元测试实例(JUnit3.8))介绍了用JUnit做单元测试的基本方法,并写了一个简单的类Calculator,其中包含了整型加减乘除的简单算法. 本文通过完善其 ...

  8. Junit 入门使用教程

    1.Junit 是什么? JUnit是一个Java语言的单元测试框架.它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit的xUnit家族中最为成功的一个JU ...

  9. Junit基本使用

    Junit基本用法 1.创建Junit Test Case 2.基本使用(以oracle数据库操作为例) package com.csit.adminsystem1.tests; import sta ...

随机推荐

  1. Http和Https三次握手那些事

    今天我总结了什么是HTTP三次握手,还有HTTPS握手的过程以及为什么HTTPS是安全的. 一:HTTP与TCP/IP区别? --->TPC/IP协议是传输层协议,主要解决数据如何在网络中传输 ...

  2. 定时组件quartz系列<二>quartz的原理

    Quartz是一个大名鼎鼎的Java版开源定时调度器,功能强悍,使用方便.   一.核心概念   Quartz的原理不是很复杂,只要搞明白几个概念,然后知道如何去启动和关闭一个调度程序即可.   1. ...

  3. PHP中最容易忘记的一些知识点总结

    1.require 和require_once 区别: 前者遇到即包含文件,后者会判断是否已经包含过了,如果包含过了,则不再包含文件.一可以节省资源,二可以避免重复定义的错误. 2.include 和 ...

  4. 关于asp.net中页面事件加载的先后顺序

    一.ASP.NET 母版页和内容页中的事件 母版页和内容页都可以包含控件的事件处理程序.对于控件而言,事件是在本地处理的,即内容页中的控件在内容页中引发事件,母版页中的控件在母版页中引发事件.控件事件 ...

  5. FreeMarker笔记 第二章 数值和类型

    2.1 基本内容 2.1.1 简介 2.1.2 什么是数值 和程序语言中的数值类型是相似的. 2.1.3 什么是类型? 2.1.4 数据模型是哈希表 2.2 类型 2.2.1 简介 2.2.2 标量 ...

  6. 高质量代码之HTML、CSS篇

    HTML篇 使用语义化标签<strong><fieldset><legend><ul>等等,少用<div><span> 判断网页 ...

  7. 内存溢出(heap corruption detected:)

    今天又遇到了上次出现的bug,然后百度了一下,想起来这是内存溢出的毛病,故记录下来! 出现的问题就是这样: heap corruption detected: after normal block(# ...

  8. AI钻石风格logo教程

    最终图像 与往常一样,这是我们要创建的最终图像: Step 1 按Ctrl+ N创建新文档.从单位下拉菜单中选择像素,在宽度和高度框中输入600,然后单击高级按钮.选择RGB,屏幕(72 PPI),并 ...

  9. javascript 作用域例子

    for(var i=0,l=url1.length;i<l;i++){ var url = url1[i]; setTimeout(function(){ window.open(url); } ...

  10. js运动 缓冲运动

    <!DOCTYPE HTML> <HTML> <meta http-equiv="Content-Type" content="text/h ...