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

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

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

public class MyList extends AbstractList {

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

你可能感兴趣的:(Mockito模拟返回类型为void的方法)