前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用Mockito来mock返回值类型为void的方法

用Mockito来mock返回值类型为void的方法

作者头像
明明如月学长
发布2021-08-27 17:10:06
9.5K0
发布2021-08-27 17:10:06
举报
文章被收录于专栏:明明如月的技术专栏

开发中有些依赖的接口还没有开发完成、有些接口还调不通等情况,可以使用Mockito对接口进行mock,然后去测试逻辑,非常好用。

最近开发中用到对void返回值类型的方法Mock,看到一篇不错的文章,翻译出来,希望对大家有帮助。

-------------------------------------------------------华丽的分割线-------------------------------------------------------

1、概述

本文的主要内容是用Mockito来mock无返回值的方法。

下面是为测试准备的类

代码语言:javascript
复制
public class MyList extends AbstractList {
  
    @Override
    public void add(int index, String element) {
        // no-op
    }
}

2、简单mock和验证

可以用 Mockito的doNothing()、doThrow()和doAnswer() 来对无返回值的函数进行Mock和验证。

代码语言:javascript
复制
@Test
public void whenAddCalledVerfied() {
    MyList myList = mock(MyList.class);
    doNothing().when(myList).add(isA(Integer.class), isA(String.class));
    myList.add(0, "");
  
    verify(myList, times(1)).add(0, "");
}

然而在Mockito中doNothing() 是对无返回值的方法mock的默认行为。

下面代码和上面的等价

代码语言:javascript
复制
@Test
public void whenAddCalledVerfied() {
    MyList myList = mock(MyList.class);
    myList(0, "");
  
    verify(myList, times(1)).add(0, "");
}

DoThrow() 则会产生异常

代码语言:javascript
复制
@Test(expected = Exception.class)
public void givenNull_AddThrows() {
    MyList myList = mock(MyList.class);
    doThrow().when(myList).add(isA(Integer.class), isNull());
  
    myList.add(0, null);
}

下面将介绍doAnswer()

3、参数获取

重写doNothing() 这个默认行为的一个重要原因是获取参数。

正如第二部分的例子,通过verify() 验证了参数传给了add()函数。

那么,如果我们需要获取参数来干点其他事情该怎么做呢?

依然还需要用doNothing() ,只不过要用到ArgumentCaptor。

代码语言:javascript
复制
@Test
public void whenAddCalledValueCaptured() {
    MyList myList = mock(MyList.class);
    ArgumentCaptor valueCapture = ArgumentCaptor.forClass(String.class);
    doNothing().when(myList).add(any(Integer.class), valueCapture.capture());
    myList.add(0, "captured");
  
    assertEquals("captured", valueCapture.getValue());
}

4、对void返回类型的方法构造answer

方法可能不仅仅只是添加一个值那么简单。这时就需要用到 Answer 类来添加我们需要的其他行为。

代码语言:javascript
复制
@Test
public void whenAddCalledAnswered() {
    MyList myList = mock(MyList.class);
    doAnswer((Answer) invocation -> {
        Object arg0 = invocation.getArgument(0);
        Object arg1 = invocation.getArgument(1);
         
        assertEquals(3, arg0);
        assertEquals("answer me", arg1);
        return null;
    }).when(myList).add(any(Integer.class), any(String.class));
    myList.add(3, "answer me");

这里也支持使用lambda表达式。

5、部分mock

 Mockito的doCallRealMethod() 方法可以用在void函数上。

代码语言:javascript
复制
@Test
public void whenAddCalledRealMethodCalled() {
    MyList myList = mock(MyList.class);
    doCallRealMethod().when(myList).add(any(Integer.class), any(String.class));
    myList.add(1, "real");
  
    verify(myList, times(1)).add(1, "real");
}

这个函数允许我们调用原始对象的实际方法同时也允许我们去调用验证。

6、结论

本文介绍了Mockito中四种对void返回值的函数进行Mock的方法。

英文原文:https://www.baeldung.com/mockito-void-methods

源代码:https://github.com/eugenp/tutorials/tree/master/testing-modules/mockito

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、概述
  • 2、简单mock和验证
  • 3、参数获取
  • 4、对void返回类型的方法构造answer
  • 5、部分mock
  • 6、结论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档