在測試過程中,難免會碰到交互的外圍系統不給力的情況,這時候mock就派上用場了,前段時間跟同學聊到這塊的時候,他向我推薦mockito這個mock工具,試用了一下,確實很好用,這里給大家介紹下這款工具:
1、mockito的特點
- 它既能mock接口也能mock實體類(咱測試框架mock工具也能做到)
- 簡單的注解語法-@Mock
- 簡單易懂,語法簡單
- 支持順序驗證
- 客戶化參數匹配器
2、mockito的配置
只需依賴jar包即可:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<scope>test</scope>
<version>1.8.5</version>
</dependency>
2、mockito的用法
注解的方式:
只需在要mock的對象上添加@Mock即可,如:
public class ArticleManagerTest {
@Mock private ArticleCalculator calculator;
@Mock private ArticleDatabase database;
@Mock private UserProvider userProvider;
private ArticleManager manager;
不使用注解:
//要mock的實體類 LinkedList mockedList = mock(LinkedList.class);
//模擬方法調用的返回值
Mockito.when(mockedList.get(0)).toReturn("first");
Mockito.when(mockedList.get(1)).toThrow(new RuntimeException());
//打印出"first"
System.out.println(mockedList.get(0));
//拋出異常 System.out.println(mockedList.get(1));
//返回null,因為還沒有對返回值做模擬
System.out.println(mockedList.get(999));
3、參數匹配器
//使用anyInt()來匹配任意int型參數 Mockito.when(mockedList.get(anyInt())).toReturn("element"); //可以使用自己定義的匹配器 (isValid()是自定義的參數匹配器):
Mockito.when(mockedList.contains(argThat(IsValid()))).toReturn("element");
public class IsValid extends ArgumentMatcher<Object> {
@Override
public boolean matches(Object argument) {
if (argument instanceof String) {
return true;
} return false;
}
}