1. 程式人生 > >Mockito(一) -- 入門篇

Mockito(一) -- 入門篇

Mockito是一種mock工具/框架。我理解EasyMock有點過時了,Mockito是現在比較流行的。

什麼是mock?說的直白一點,大家都知道unit test應該是儘可能獨立的。對一個class的unit test不應該再和其他class有任何互動。

現在有一個類,掃描一個目錄並將找到的檔案都上傳到FTP server。該類對於不同的FTP響應(找不到FTP server 或 上傳成功,或上傳失敗),有一些後續操作。

在寫這個類的UT時,我們就必須虛構出來一個FTP物件。這樣在UT中,這個虛構的物件能夠代替真正的FTP,對被測試類的呼叫做出一定的響應。從而知道被測試類是否正確的呼叫了FTP並做出一些正確的期望的響應。從而達到測試的目的。

mock可以模擬各種各樣的物件,從而代替真正的物件做出希望的響應。

關於mock的概念和EasyMock,可以參考:

 Mock object and EasyMock framework

 一篇很好的入門文章:

http://blog.csdn.net/huoshuxiao/archive/2010/12/30/6107835.aspx

 一些稍微複雜且實用一點的例子:

下面介紹mockito的基本使用方法。

 如前面所說,我們需要建立一個mock物件來代替真的物件。

因此,

模擬物件是第一步。模擬物件使用mock();

指定mock物件被呼叫時的返回值是第二步,比如指定讓mockFTP物件第一次被呼叫時返回"找不到FTP server"。這一步一般稱為stubbing。一般是when(mockedList.get(0

)).thenReturn("first")的樣子。

驗證被測試類是否正確工作是第三步,使用verify()。例如,驗證當mockFTP物件返回"找不到FTP server"時,測試程式碼是否按要求重試。

然後測試就完成啦~~

模擬物件:

  1. // 模擬LinkedList 的一個物件  
  2. LinkedList mockedList = mock(LinkedList.class);   
  3. // 此時呼叫get方法,會返回null,因為還沒有對方法呼叫的返回值做模擬   
  4. System.out.println(mockedList.get(999));  

模擬方法呼叫的返回值:

  比如

  1. // 模擬獲取第一個元素時,返回字串first。
      給特定的方法呼叫返回固定值在官方說法中稱為stub。
  2. when(mockedList.get(0)).thenReturn("first");   
  3. // 此時列印輸出first   
  4. System.out.println(mockedList.get(0));  

模擬方法呼叫丟擲異常:

  1. // 模擬獲取第二個元素時,丟擲RuntimeException  
  2. when(mockedList.get(1)).thenThrow(new RuntimeException());   
  3. // 此時將會丟擲RuntimeException  
  4. System.out.println(mockedList.get(1));  
 沒有返回值型別的方法也可以模擬異常丟擲:

doThrow(new RuntimeException()).when(mockedList).clear();

模擬呼叫方法時的引數匹配:

  1. // anyInt()匹配任何int引數,這意味著引數為任意值,其返回值均是element  
  2. when(mockedList.get(anyInt())).thenReturn("element");   
  3. // 此時列印是element   
  4. System.out.println(mockedList.get(999)); 

模擬方法呼叫次數:

  1. // 呼叫add一次   
  2. mockedList.add("once");   
  3. // 下面兩個寫法驗證效果一樣,均驗證add方法是否被呼叫了一次  
  4. verify(mockedList).add("once");   
  5. verify(mockedList, times(1)).add("once");  
 還可以通過atLeast(int i)和atMost(int i)來替代time(int i)來驗證被呼叫的次數最小值和最大值。 結束~很簡單吧。 這篇文章基本上是轉帖,下篇文章將介紹如何在程式碼裡使用Mockito,最後介紹mockito的大部分功能。