前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在用Mockito做单元测试时如何使用doAnswer…when

在用Mockito做单元测试时如何使用doAnswer…when

作者头像
疯狂软件李刚
发布2020-06-24 17:07:50
11.4K0
发布2020-06-24 17:07:50
举报
文章被收录于专栏:疯狂软件李刚

添加关注

刚使用Mockito来做Java项目的单元测试时,对doAnswer…when的使用场合不怎么理解,查了Mockito的官方文档和网上的各种资料,感觉都说得不够清楚。后来自己用它在项目中做了些unit tests,终于弄明白了。

原来,doAnswer…when和when…thenReturn的功能类似,都是用于给模拟对象指定调用其方法后的返回值,只不过二者有如下区别:

01

when…thenReturn:

当我们为模拟对象指定调用其方法的返回值时, when…thenReturn用于直接返回一个简单的值。

02

doAnswer…when:

当模拟对象调用它的方法,需要执行一些操作(其实就是需要执行一个代码块)才能得到返回值时,则需要使用doAnswer来构造产生这个模拟的返回值。例如:当模拟对象调用某个方法的返回值是个复合值(bean)时,就需要用doAnswer来构造该返回值。

下面通过代码来看它们的使用场合, 首先是使用when…thenReturn的代码:

代码语言:javascript
复制
@Mock
private SecurityBean testSecurity;
...

@Before
public void init() {
    try {
        ...
        
        Mockito.when(testSecurity.getSecurityId()).thenReturn("testSecurityId");
        ...
        
    } catch (Exception e) {
         log.error("errorin setting up mocked responses", e);
    }
}

上面灰色背景代码为testSecurity这个模拟对象指定当它调用getSecurityId()这个方法时, 将得到 "testSecurityId" 这个字符串作为返回值。

接下来再看使用doAnswer…when的代码:

代码语言:javascript
复制
@Mock
private StockDao stockDao;
...

@Before
public void init() {
    try {
        ...
        doAnswer(new Answer<StockModel>) {
            @Override
            public StockModel answer(InvocationOnMock invocation) throws Throwable {
                StockModel  stock = new StockModel ();
                stock.setFundFamilyName("fundFamily01");
                return stock;
            }
        }).when(stockDao).lookup("testStock");
        ...
    } catch (Exception e) {
        log.error("error in setting up mocked responses", e);
    }
}

上面灰色背景代码为stockDao这个模拟对象指定当它调用lookup()这个方法(参数为 "testStock" )时, 将得到一个fundFamilyName为指定值的StockModel对象作为返回值。

本文结束

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 疯狂软件李刚 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档