2017-02-27 85 views
0

我知道我並不需要知道Mockito如何在引擎蓋下進行所有操作,以便能夠使用它,但是這讓我困惑不已,任何我很好奇的理解它。有幾種Mockito方法,我不明白他們可能如何工作。一個很好的例子是:Mockito.when如何在引擎蓋下工作

OngoingStubbing<T> Mockito.when(T methodCall) 

您可以使用該做的事情,如:

Object mockedObject = Mockito.mock(Object.class); 
Mockito.when(mockedObject.toString()).thenReturn("super cool string"); 
System.out.println(mockedObject.toString()); 

此代碼將使輸出:

super cool string 

我知道如何使用它,但我不明白這可能如何工作。 Mockito.When如何知道我們所關心的模擬對象和方法?據我所知,我們沒有傳入mockedObject,我們傳遞了一個類型爲String的值mockedObject.toString()。我很確定,在設置所有「when/thenReturn」之前,mockedObject.toString()只返回null。那麼,爲什麼不在這一樣做:

Object mockedObject = Mockito.mock(Object.class); 
mockedObject.toString(); 
Mockito.when(null).thenReturn("super cool string"); 
System.out.println(mockedObject.toString()); 

顯然,第二個代碼段沒有任何意義,但它似乎是兩個代碼段應在功能上等同。

編輯: 這兩個代碼段實際上是都是是一樣的。請參閱我的回答以下我自己的問題。

+0

這是發佈問題後發現的一個經典案例。看到我的回答在 – NateW

+0

以下https://stackoverflow.com/questions/14440270/how-does-mockito-when-invocation-work –

回答

0

Doh!

我想我應該實際上已經嘗試運行我的示例代碼之前,我發佈此問題。

事實證明,兩個代碼段實際上等效。我只是假定他們不是。

這個啓示揭示瞭如何在引擎蓋下實現Mockito.when。

我現在最好的猜測是,當mockedObject被模擬時,Object.toString()的新創建實現的一部分記錄了.toString()方法被調用(爲了獲得Mockito,必須完成此操作.verify()工作)。然後它必須在某種線程本地靜態變量中將此調用記錄到模擬方法中。然後,當我調用when()時,它實際上忽略了輸入值(除了可能使用它的類型?),然後搜索最近在該線程中存在的任何模擬對象上調用的任何mocked方法(或者只有方法調用匹配該簽名)。無論上次調用什麼方法,都是它決定修改的方法。

這當然只是我的猜測,基於我如何觀察mockito的功能。實際的實施可能不同,但這至少是有道理的。