Mockito模拟返回类型为void的方法

该系列文章翻译自https://www.baeldung.com/mockito-series

void类型的方法可以使用Mockito的doNothing()、doThrow()、doAnswer() 和doCallRealMethod()进行模拟。下面使用MyList类进行介绍

public class MyList extends AbstractList<String> {

    @Override
    public String get(final int index) {
        return null;
    }
    @Override
    public int size() {
        return 1;
    }

    @Override
    public void add(int index, String element) {
        // no-op
    }
}

1. doNothing()

doNothing()是Mockito在处理void类型方法的默认操作,以下两种方式是等价的:

@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, "");
}
@Test
public void whenAddCalledVerfied() {
    MyList myList = mock(MyList.class);
    myList.add(0, "");
  
    verify(myList, times(1)).add(0, "");
}

doNothing()可以和参数捕获器一起使用,从而校验方法的参数,如下:

@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());
}

2. doThrow()

doThrow用于产生异常

  @Test(expected = RuntimeException.class)
    public void givenNull_AddThrows() {
        MyList myList = mock(MyList.class);
        doThrow(RuntimeException.class).when(myList).add(isA(Integer.class), isNull());

        myList.add(0, null);
    }

3. doAnswer()

可以再doAnswer()中添加更多的校验细节,在下面的例子中,对方法的参数进行了校验。

@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");
}

4. doCallRealMethod()

doCallRealMethod()用于调用真实的方法

@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");
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,187评论 6 13
  • 什么是 Mock mock 的中文译为: 仿制的,模拟的,虚假的。对于测试框架来说,即构造出一个模拟/虚假的对象,...
    Whyn阅读 4,391评论 0 3
  • 申明依赖 testCompile"junit:junit:$rootProject.ext.junitVersio...
    joxHero阅读 4,414评论 0 7
  • 在博客Android单元测试之JUnit4中,我们简单地介绍了:什么是单元测试,为什么要用单元测试,并展示了一个简...
    水木飞雪阅读 9,618评论 4 18
  • 嬉皮笑脸只为愉人娱己,走了该走能走之路;闲口无言因当慈父劬夫,圆了能圆该圆之心。
    梅花瓣阅读 229评论 0 0