// Will throw UnfinishedStubbingException
doAnswer(invocation -> "Joshua").when(service.getAuthor());
那么,什么时候使用 doAnswer而不是 thenReturn呢? 我可以想到两种用例:
当您想要“存根”void 方法时。
使用 doResponse,您可以在方法调用时执行一些附加操作。
BookServiceCallback callback = new BookServiceCallback() {
@Override
public void onSuccess(String bookTitle) {
assertEquals("Effective Java", bookTitle);
}
};
doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
BookServiceCallback callback = (BookServiceCallback) invocation.getArguments()[0];
callback.onSuccess("Effective Java");
// return null because queryBookTitle is void
return null;
}
}).when(service).queryBookTitle(callback);
service.queryBookTitle(callback);
当您使用 Spy 而不是 Mock 时
当使用 When-then Return on Spy Mockito 时,它会调用 real method,然后停止你的回答。如果您不想调用 real method,这可能会导致问题,如下面的示例所示:
List list = new LinkedList();
List spy = spy(list);
// Will throw java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
when(spy.get(0)).thenReturn("java");
assertEquals("java", spy.get(0));
我们可以安全地将它存根。
List list = new LinkedList();
List spy = spy(list);
doAnswer(invocation -> "java").when(spy).get(0);
assertEquals("java", spy.get(0));
实际上,如果不想在方法调用时执行其他操作,可以使用 doReturn。
List list = new LinkedList();
List spy = spy(list);
doReturn("java").when(spy).get(0);
assertEquals("java", spy.get(0));