doAnswer in mockito-什么时候是懒惰评估,什么时候是渴望评估



我使用的是带有以下代码的mockito spy:

Mockito.doAnswer(new Answer() {
    Object answer(InvocationOnMock invocation) {
         ImagesSorter mock = (ImagesSorter) invocation.getMock();
         Object[] args = invocation.getArguments();
         return mock.sortImages((List<Image>) args[0], (UserInfo) args[1],
                 fakeNowDate);
    }
}).when(imagesSorterSpy).sortImages(imagesAsInsertionOrder, user);

当结构为:时,我看到answer()被急切地调用

when(spy.method())./*...*/.

但当结构为时,它是惰性评估

/*...*/.when(spy).method()

难道不应该反过来吗?意味着/*...*/.when(spy).method()是渴望而when(spy.method())./*...*/.是懒惰?像do..while loop

我找不到的文档

关于此语法,您应该注意一件事:

when(spy.method()).thenAnswer(someAnswer);

Java在评估它时要做的第一件事是运行吗:

     spy.method()

从而可以将准确的返回值传递到CCD_ 6方法中。当然,when会丢弃它的参数,只读取对mock的最后一次调用,但Java无法从语法中知道这一点。对于mock上对when的第一次调用,该方法应该没有异常或副作用,但这种假设不适用于间谍或您已经存根化的方法


通常,doAnswer和其他doVerb方法有两个关键用途:存根void方法重写已定义的行为(即用于间谍和已存根方法)。

作废方法

// Doesn't work: voidMethod has no return value, so when() has no parameter
when(yourMock.voidMethod()).thenThrow(new RuntimeException());
// This works, because it skips reading the voidMethod return value:
doThrow(new RuntimeException()).when(yourMock).voidMethod();

已经存根的方法

// Doesn't work: This contains a call to dangerousMethod!
when(yourSpy.dangerousMethod()).thenReturn(safeValue);
// This works, because the call to dangerousMethod happens on a dummy copy of yourSpy:
doReturn(safeValue).when(yourSpy).dangerousMethod();

正如lkrnac的回答中所指出的,Mockito在顶级Mockito文档中的"关于监视真实物体的重要问题!"中描述了后一种情况。

我相信间谍的/*...*/.when(spy).method()语法是Mockito实现的细节。如果你想一想,当你不想调用真正的方法时,你会如何在这个调用when(spy.method())./*...*/中实现Mockito功能来在spy上存根方法?你需要有不同的API间谍,因为API用于模拟是不合适的。

以下是相关文件(请参阅"监视真实物体的重要问题!"一节):https://mockito.googlecode.com/svn/tags/latest/javadoc/org/mockito/Mockito.html#13

最新更新