doAnswer中的Mockito - 当是懒惰的评价,当是渴望?(doAnswer in moc

2019-10-21 01:44发布

我使用的是用的Mockito此代码间谍:

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);

我一看便知()被称为热切当结构是:

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

但它是懒惰的评价时,结构是:

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

它不应该被反之亦然? 含义/*...*/.when(spy).method()是渴望与when(spy.method())./*...*/. 是懒惰? 像do..while loop

我无法找到该文件

Answer 1:

有一件事你应该注意到这个语法:

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

是的第一件事就是评估时,Java将做的是运行:

     spy.method()

......因此,它可以通过一个精确的返回值进入when方法。 当然, when抛弃它的参数,只是读了假的最后一次通话,但Java可以不知道从语法。 对于最初的呼叫when在一个模拟的方法应该没有异常或副作用,但这种假设并不在间谍或您已经存根方法持有


在一般情况下, doAnswerdoVerb方法有两个主要用途: 磕碰无效的方法压倒一切的已定义的行为 (即,间谍和已存根方法)。

虚空方法

// 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。



Answer 2:

我相信/*...*/.when(spy).method()语法间谍是执行的Mockito细节。 如果你仔细想想,你将如何实现功能的Mockito在这个调用存根方法窥探when(spy.method())./*...*/ ,当你不想调用真正的方法是什么? 你需要有不同的API为间谍,因为用于嘲笑API是不适合的。

下面是有关文件(见“关于间谍实物重要抓把柄!”部分): https://mockito.googlecode.com/svn/tags/latest/javadoc/org/mockito/Mockito.html#13



文章来源: doAnswer in mockito - when is it lazy evaluation and when is it eager?