博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【JUnit】EasyMock用法总结
阅读量:7295 次
发布时间:2019-06-30

本文共 2120 字,大约阅读时间需要 7 分钟。

使用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);    

转载于:https://www.cnblogs.com/heidsoft/p/3832241.html

你可能感兴趣的文章
3 weekend110的hadoop中的RPC框架实现机制 + hadoop中的RPC应用实例demo
查看>>
《高效程序员的修炼》 读书笔记
查看>>
Nature:中国正在上演AI人才争夺战,中国公司在与Google竞争
查看>>
VS代码提示不出现或者提示变成英文或者各种奇葩问题的解决
查看>>
WGS 1984 Web Mercator 对于在线地图服务的意义
查看>>
Word2vec 讨论
查看>>
HBase编程 API入门系列之put(客户端而言)(1)
查看>>
percona-toolkit之pt-kill:杀掉mysql查询或连接
查看>>
JavaScriptSerializer 对json数据转换
查看>>
重裝系統,磁盤消失解決方法
查看>>
11.13. Highslide
查看>>
Visual Studio 11 Beta 带来新的Metro 应用开发体验
查看>>
最佳实践: 勿在 Servlet 中实现 SingleThreadModel
查看>>
IIS发生意外错误0x8ffe2740
查看>>
架构设计中服务层的简单理解
查看>>
一般的相关分析代码
查看>>
单片机系列学习
查看>>
[LeetCode] Combinations
查看>>
java中的几种对象(PO,VO,DAO,BO,POJO)
查看>>
HDOJ--4786--Fibonacci Tree【生成树】
查看>>