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
驗證被測試類是否正確工作是第三步,使用verify()。例如,驗證當mockFTP物件返回"找不到FTP server"時,測試程式碼是否按要求重試。
然後測試就完成啦~~
模擬物件:
- // 模擬LinkedList 的一個物件
- LinkedList mockedList = mock(LinkedList.class);
- // 此時呼叫get方法,會返回null,因為還沒有對方法呼叫的返回值做模擬
- System.out.println(mockedList.get(999));
模擬方法呼叫的返回值:
比如
- // 模擬獲取第一個元素時,返回字串first。
- when(mockedList.get(0)).thenReturn("first");
- // 此時列印輸出first
- System.out.println(mockedList.get(0));
模擬方法呼叫丟擲異常:
- // 模擬獲取第二個元素時,丟擲RuntimeException
- when(mockedList.get(1)).thenThrow(new RuntimeException());
- // 此時將會丟擲RuntimeException
- System.out.println(mockedList.get(1));
doThrow(new RuntimeException()).when(mockedList).clear();
模擬呼叫方法時的引數匹配:
- // anyInt()匹配任何int引數,這意味著引數為任意值,其返回值均是element
- when(mockedList.get(anyInt())).thenReturn("element");
- // 此時列印是element
- System.out.println(mockedList.get(999));
模擬方法呼叫次數:
- // 呼叫add一次
- mockedList.add("once");
- // 下面兩個寫法驗證效果一樣,均驗證add方法是否被呼叫了一次
- verify(mockedList).add("once");
- verify(mockedList, times(1)).add("once");