开发中有些依赖的接口还没有开发完成、有些接口还调不通等情况,可以使用Mockito对接口进行mock,然后去测试逻辑,非常好用。
最近开发中用到对void返回值类型的方法Mock,看到一篇不错的文章,翻译出来,希望对大家有帮助。
-------------------------------------------------------华丽的分割线-------------------------------------------------------
本文的主要内容是用Mockito来mock无返回值的方法。
下面是为测试准备的类
public class MyList extends AbstractList {
@Override
public void add(int index, String element) {
// no-op
}
}
可以用 Mockito的doNothing()、doThrow()和doAnswer() 来对无返回值的函数进行Mock和验证。
@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的默认行为。
下面代码和上面的等价
@Test
public void whenAddCalledVerfied() {
MyList myList = mock(MyList.class);
myList(0, "");
verify(myList, times(1)).add(0, "");
}
DoThrow() 则会产生异常
@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()
重写doNothing() 这个默认行为的一个重要原因是获取参数。
正如第二部分的例子,通过verify() 验证了参数传给了add()函数。
那么,如果我们需要获取参数来干点其他事情该怎么做呢?
依然还需要用doNothing() ,只不过要用到ArgumentCaptor。
@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());
}
方法可能不仅仅只是添加一个值那么简单。这时就需要用到 Answer 类来添加我们需要的其他行为。
@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表达式。
Mockito的doCallRealMethod() 方法可以用在void函数上。
@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返回值的函数进行Mock的方法。
英文原文:https://www.baeldung.com/mockito-void-methods
源代码:https://github.com/eugenp/tutorials/tree/master/testing-modules/mockito