该系列文章翻译自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");
}
网友评论