2012-10-22 112 views
0
//Let's import Mockito statically so that the code looks clearer 
import static org.mockito.Mockito.*; 

//mock creation 
List mockedList = mock(List.class); 

//using mock object 
mockedList.add("one"); 
mockedList.clear(); 

//verification 
verify(mockedList).add("one"); 
verify(mockedList).clear(); 

我不明白這個構造的意義是什麼?它有什麼幫助?與調用函數有什麼不同?
該文檔相當薄。
謝謝mockito模擬驗證

+0

你基本上問:「我的我會永遠需要模擬測試類」,其中谷歌一定能夠幫助您。另外:http://code.google.com/p/mockito/wiki/FeaturesAndMotivations –

+1

可能重複[What's Mocking?](http://stackoverflow.com/questions/2665812/what-is-mocking) – nes1983

回答

3

要測試的是A類的一些方法Foo調用一些方法Bar類B.換句話說,你在測試類A.在測試期間的對象,你讓B類的模擬然後你將這個模擬對象以某種方式傳遞給A類(取決於A類的實際工作方式)。當您的測試運行A類的Foo方法時,您期望Bar方法在您的B類模擬上被調用。通過調用verify作爲Bar方法,在對Foo方法進行測試後,您可以檢查Foo方法實際上工作正常 - 它叫Bar

3

當你這樣做mockedList.add("one");其執行mocked object的操作同時它會記住你的操作。因此,當您執行verify(mockedList).add("one");時,它會驗證在mockedList上調用add時參數one

希望你有所作爲。

+0

什麼我能通過這樣做發現嗎?我仍然沒有看到一個實際的例子 – titus

+0

@titus這是一個簡單的例子。當您將此對象傳遞給某個自定義方法時,請考慮一個場景。現在您想驗證一下,該對象上的某個特定方法是否被調用或否。這將很有用。另一個區別是使用你的模擬對象進行存根,當你在處理對象時變得非常重要,而這些對象在你的測試環境中是不可用的。你可以簡單地模擬和存根他們。一旦被調用,mockito將使用stubbed行爲。 –

0

事實上,在你的例子很明顯,但在真正的代碼測試驗證方法調用的主要思想出現 - 想象一些代碼執行方法調用,比如:

class A{ 
.... 
service.doSomething(<some arguments>) 
.... 
} 

爲了測試它,你會通過模擬服務對象,但有時你想驗證爲該調用傳遞的特定參數值(或調用次數),所以你會像在你的例子中那樣使用驗證。

1

的Mockito的驗證方法是驗證該方法調用的時間,如果調用時間爲1,我們可以省略該參數,看的Mockito的源代碼行1473

public static <T> T verify(T mock) { 
    return MOCKITO_CORE.verify(mock, times(1)); 
} 

所以你的代碼

verify(mockedList).add("one"); 
//is the same as 
verify(mockedList,times(1)).add("one"); 

確實驗證add方法的執行一次