繁体   English   中英

在mockito中执行doAnswer-何时进行惰性评估,何时进行评估?

[英]doAnswer in mockito - when is it lazy evaluation and when is it eager?

我使用带有以下代码的嘲笑间谍:

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的方法,该方法应该没有异常或副作用,但是这种假设并不适用于间谍或已经打桩的方法


通常, 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()/*...*/.when(spy).method()语法是Mockito实现的细节。 如果考虑到这when(spy.method())./*...*/ ,当您不想调用真实方法时,如何在此调用when(spy.method())./*...*/时实现Mockito功能以对间谍程序存根。 您需要为间谍使用不同的API,因为用于模拟的API不适合。

这是相关的文档(请参阅“监视真实对象的重要提示!”部分): https : //mockito.googlecode.com/svn/tags/latest/javadoc/org/mockito/Mockito.html#13

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM