java - mockito 中的 doAnswer - 什么时候是惰性评估,什么时候是急切的?

标签 java unit-testing mockito lazy-evaluation

我在这段代码中使用 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()

...以便它可以将准确的返回值传递给 when 方法。当然,when 会丢弃它的参数并只读取对模拟的最后一次调用,但 Java 无法从语法中知道这一点。对于模拟中第一次调用 when 时,该方法应该没有异常或副作用,但是该假设不适用于 spy 或您已经 stub 的方法.


通常,doAnswer 和其他 doVerb 方法有两个关键用途: stub 无效方法覆盖已定义的行为(即对于 spy 和已经 stub 的方法)。

无效方法

// 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's answer 中所述, Mockito 在 "important gotcha on spying real objects!" 中描述了后一种情况。在顶级 Mockito 文档中。

关于java - mockito 中的 doAnswer - 什么时候是惰性评估,什么时候是急切的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26157851/

相关文章:

javascript - 如何克隆 Javascript 类

java - 如何从非模拟方法中获取结果?

java - 如何在 Java 中模拟请求 header

java - Jacoco 显示 0% 覆盖率,即使在使用 @PrepareForTest 注释时成功执行测试用例

java - 使用混淆器混淆源代码

java - 如何在执行时设置文件变量名

java - 非继承抽象类有什么用途?

java - HashTable 和 Collections.synchronized(HashMap) 的效率

java - 在容器外实例化 spring bean(用于测试)

ruby-on-rails - Rails 中的负载夹具