EasyMock记录


      一般我们先创建一个Mock对象,然后record(录制)这个对象的行为,接着将对象设置为replay(回放)状态,之后我们执行需要测试的业务代码并检验代码是否返回正确的结果,最后,我们可以verify(验证)整个过程中,Mock对象是否完成了record阶段的设定。
      

1、生成Mock接口

[java]  view plain  copy
 print ?
  1. IService mockService = EasyMock.createMock("name", IService.class);  

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

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

[java]  view plain  copy
 print ?
  1. IMocksControl control = EasyMock.createControl();    
  2. IService1 mockObj1 = control.createMock(IService1.class);    
  3. IService2 mockObj2 = control.createMock(Iservice2.class);    

2、设置预期行为

如果返回值是void:

[java]  view plain  copy
 print ?
  1. mockService.doVoidMethod();  
  2. EasyMock.expectLastCall();// 最新版本的EasyMock可以忽略此句  

如果要求抛出异常:

[java]  view plain  copy
 print ?
  1. EasyMock.expectLastCall().andThrow(  
  2.                 new MyException(new RuntimeException())).anyTimes();  

如果返回值不是void:

[java]  view plain  copy
 print ?
  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状态

[java]  view plain  copy
 print ?
  1. EasyMock.replay(mockService);  
如果是用MockControl来管理:
[java]  view plain  copy
 print ?
  1. control.replay();    


4、测试

[java]  view plain  copy
 print ?
  1. bo.setService(mockService);  
  2. bo.doSomething();  

5、验证Mock对象的行为

[java]  view plain  copy
 print ?
  1. EasyMock.verify(mockService);   
如果是用MockControl来管理:
[java]  view plain  copy
 print ?
  1. control.verify();  

expect()注意事项


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

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

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

要用:EasyMock.anyLong()


期望传入参数可能为null时

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

[java]  view plain  copy
 print ?
  1. isA(String.class)  
而实际传入的是null,则会报错 (isA(java.lang.String), <any>): expected: 1, actual: 0

应该用:

[java]  view plain  copy
 print ?
  1. or(isA(String.class), isNull())  


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

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

[java]  view plain  copy
 print ?
  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.         });  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值