前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >junit mock 方法(need的用法总结)

junit mock 方法(need的用法总结)

作者头像
全栈程序员站长
发布2022-07-28 18:14:14
9220
发布2022-07-28 18:14:14
举报

大家好,又见面了,我是你们的朋友全栈君。

使用EasyMock的总体步骤

1、生成Mock接口

代码语言:javascript
复制
IService mockService = EasyMock.createMock("name", IService.class);

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

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

代码语言:javascript
复制
    IMocksControl control = EasyMock.createControl();  
    IService1 mockObj1 = control.createMock(IService1.class);  
    IService2 mockObj2 = control.createMock(Iservice2.class);  

2、设置预期行为

如果返回值是void:

代码语言:javascript
复制
mockService.doVoidMethod();
EasyMock.expectLastCall();// 最新版本的EasyMock可以忽略此句

如果要求抛出异常:

代码语言:javascript
复制
EasyMock.expectLastCall().andThrow(
                new MyException(new RuntimeException())).anyTimes();

如果返回值不是void:

代码语言:javascript
复制
EasyMock.expect(mockService.doSomething(isA(Long.class), isA(Report.class), 
		isNull(Report.class))).andReturn("return string").anyTimes();

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

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

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

代码语言:javascript
复制
EasyMock.replay(mockService);

如果是用MockControl来管理:

代码语言:javascript
复制
control.replay();  

4、测试

代码语言:javascript
复制
bo.setService(mockService);
bo.doSomething();

5、验证Mock对象的行为

代码语言:javascript
复制
EasyMock.verify(mockService); 

如果是用MockControl来管理:

代码语言:javascript
复制
control.verify();

expect()注意事项

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

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

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

要用:EasyMock.anyLong()

期望传入参数可能为null时

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

代码语言:javascript
复制
isA(String.class)

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

应该用:

代码语言:javascript
复制
or(isA(String.class), isNull())

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

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

代码语言:javascript
复制
EasyMock.expect(mockService.execute(EasyMock.anyInt())).andAnswer(new IAnswer<Integer>() {
            public Integer answer() throws Throwable {
                Integer count = (Integer) EasyMock.getCurrentArguments()[0];
                return count * 2;
            }
        });

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

times()

常见问题

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

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

比如这样写:

代码语言:javascript
复制
    expect(mockEmployeeRepository.findByDepartmentAndSpecification("HR",   
           isA(EmployeeSearchSpecification.class)).andReturn(emplooyees);  

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

代码语言:javascript
复制
    expect(mockEmployeeRepository.findByDepartmentAndSpecification(eq("HR"),  
           isA(EmployeeSearchSpecification.class)).andReturn(employees);  

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/128679.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年4月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用EasyMock的总体步骤
    • 1、生成Mock接口
      • 2、设置预期行为
        • 3、将Mock对象切换到replay状态
          • 4、测试
            • 5、验证Mock对象的行为
            • expect()注意事项
              • 期望传入参数为基本类型时
                • 期望传入参数可能为null时
                  • 如果返回结果在运行时才能确定
                    • times()
                    • 常见问题
                      • java.lang.IllegalStateException: 2 matchers expected, 1 recorded.
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档