簡體   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