Mockito
在開發中,我們經常會依賴同事或者第三方提供的接口,如果依賴的接口無法正常返回,比如該接口正在修復,或者網絡異常無法調用第三方接口,那么對依賴該接口的開發會造成很大影響。
這時我們可能會想到模擬該接口以提供正常的返回值,用來繼續當前的工作。
使用Mockito可以幫助我們解決這個問題。Mockito是進行Mock測試的一個框架,使用一個虛擬的Mock對象來模擬現實中比較復雜的對象。
其主要目標用來模擬復雜接口的實現:
比如
LinkedList mockedList = mock(LinkedList.class);
//模擬mockList行為
when(mockedList.get(0)).thenReturn("first");
when(mockedList.get(1)).thenThrow(new RuntimeException());
通過when函數來執行mockList的行為: 當獲取第0個元素時,返回 first;獲取第1個元素時,拋出RuntimeException異常。
舉個例子:
數據庫查詢時,ResultSetHandle需要通過Statement接口的實現類來獲得數據庫查詢的結果;如果要實現Statement接口相對來說比較復雜,那么可以使用Mock出一個虛擬的實現來進行ResultSetHandler的測試。
這里創建一個簡單的demo來進行演示:
- 建立一個Statement接口:
public interface Statement {
String query();
}
- 再建立一個ResultSetHandler類,其方法handlerResultSets需要一個實現Statement接口的類
public class ResultSetHandler {
public void handlerResultSets(Statement statement) {
String queryStr = statement.query ();
System.out.println (queryStr);
}
}
- 建立測試類:使用Mockito創建一個Statement接口的模擬實現類,傳入需要調用的方法,可以很方便的對ResultSetHandler進行測試,解除了對Statement實現類的依賴,
public class MockTest {
public static void main(String[] args) {
// 使用mock模擬Statement接口行為,這里假設執行查詢,返回的結果為test
Statement imock = Mockito.mock (Statement.class);
Mockito.when (imock.query ()).thenReturn ("test");
// spy用來模擬一個對象
ResultSetHandler useMock = Mockito.spy (ResultSetHandler.class);
useMock.handlerResultSets (imock);
}
}
小結
本文使用Mockito的stubbing實現了簡單接口,為調用該接口的類提供了一個模擬對象,還有很多高級特性可以參考Mockito官網進行學習
了解更多請關注微信公眾號:

