1. 程式人生 > >Mockito簡單介紹及示例

Mockito簡單介紹及示例

2 Mockito

Mockito是一個流行的Mocking框架。它使用起來簡單,學習成本很低,而且具有非常簡潔的API,測試程式碼的可讀性很高。因此它十分受歡迎,使用者群越來越多,很多的開源的軟體也選擇了Mockito。

Maven

如果專案是通過Maven管理的,需要在專案的Pom.xml中增加如下的依賴:

<dependencies>

<dependency>

<groupId>org.mockito</groupId>

<artifactId>mockito-all</artifactId>

<version>1.8.5</version>

<scope>test</scope>

</dependency>

</dependencies>

2.1 簡單示例:

1) 

import static org.mockito.Mockito.*;  

import java.util.List;  

import org.junit.Assert;  

import org.junit.Test;  

public class TestMock {  

    @Test  

    public void simpleTest(){  

        //建立mock物件,引數可以是類,也可以是介面  

        List<String> list = mock(List.class);  

        //設定方法的預期返回值  

        when(list.get(0)).thenReturn("helloworld");  

        String result = list.get(0);  

        //驗證方法呼叫(是否呼叫了get(0))  

        verify(list).get(0);  

        //junit測試  

        Assert.assertEquals("helloworld", result);  

    }  

}  

2

import static org.mockito.Mockito.*;  

import java.util.LinkedList;

import java.util.List;  

import org.junit.Assert;  

import org.junit.Test;

public class TestMockito2 {

@Test

public void simpleTest(){

LinkedList mockedList = mock(LinkedList.class) ;

System.out.println(mockedList.get(999)) ;

when(mockedList.get(0)).thenReturn("first") ;

System.out.println(mockedList.get(0)) ;

}

}

以上兩個示例執行之後第一個示例沒有任何回顯,只是將結果與預定值進行對比;對比結果一致則正常執行,對比結果不一致則報錯。而第二個示例會在控制檯列印資訊:

 

2.1.2  mock建立物件

可使用如下語法建立物件,可以對類和介面進行mock物件的建立,建立時可以為mock物件命名。對mock物件命名的好處是除錯的時候容易辨認mock物件。建立mock物件不能對finalAnonymous primitive類進行mock

mock(Class<T> classToMock);

mock(Class<T> classToMock, String name)

mock(Class<T> classToMock, Answer defaultAnswer)

mock(Class<T> classToMock, MockSettings mockSettings)

mock(Class<T> classToMock, ReturnValues returnValues)

示例2中建立mock物件:

1. // 模擬LinkedList 的物件   

2. LinkedList mockedList = mock(LinkedList.class);   

3.   

4. // 此時呼叫get方法,是會返回null,因為還沒有對方法呼叫的返回值做模擬    

5. System.out.println(mockedList.get(999));

2.1.3 模擬返回值

因為建立模擬物件時沒有對這裡呼叫的get()方法進行返回值模擬,所以該方法的返回值為null,所以示例2中第一次列印結果為null

對方法返回值進行模擬:

1. // 模擬獲取第一個元素時,返回字串first  

2. when(mockedList.get(0)).thenReturn("first");   

3.   

4. // 此時列印輸出first   

5. System.out.println(mockedList.get(0));  

因為已經對方法的返回值進行了模擬,所以第二次列印的值為已定義的模擬值。

2.1.4 異常模擬

也可以對異常方法異常進行模擬:

1. // 模擬獲取第二個元素時,丟擲RuntimeException  

2. when(mockedList.get(1)).thenThrow(new RuntimeException());  

3.   

4. // 此時將會丟擲RuntimeException  

5. System.out.println(mockedList.get(1));  

在示例2中新增上述程式碼,對異常進行模擬,執行之後得到如下結果:

 

此時,系統會丟擲模擬的異常,當然沒有返回值的方法也是可以模擬其丟擲異常的:

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

2. mockList.clear();

此時,系統丟擲異常:

 


2.1.5 方法匹配引數模擬

也可以對方法的引數匹配模擬:

1. // anyInt()匹配任何int引數,這意味著引數為任意值,其返回值均是element  

2. when(mockedList.get(anyInt())).thenReturn("element");   

3.   

4. // 此時列印是element   

5. System.out.println(mockedList.get( ));  

結果:

 

2.1.6 附表(更多靈活的引數搭配)

方法一覽

static boolean

anyBoolean() 
any boolean, Boolean or null.

static byte

anyByte() 
any byte, Byte or null

static char

anyChar() 
any char, Character or null.

static java.util.Collection

anyCollection() 
any Collection or null.

static double

anyDouble() 
any double, Double or null.

static float

anyFloat() 
any float, Float or null.

static int

anyInt() 
any int, Integer or null.

static java.util.List

anyList() 
any List or null.

static long

anyLong() 
any long, Long or null.

static java.util.Map

anyMap() 
 any Map or null.

static<T> T

anyObject() 
any Object or null.

static short

anyShort() 
any short, Short or null.

static java.lang.String

any String or null.

Static<T> T

argThat(org.hamcrest.Matcher<T> matcher)

Allows creating custom argument matchers.

static boolean

booleanThat(org.hamcrest.Matcher<java.lang.Boolean> matcher)

Allows creating custom argument matchers.

static byte

byteThat(org.hamcrest.Matcher<java.lang.Byte> matcher)

Allows creating custom argument matchers.

static char

charThat(org.hamcrest.Matcher<java.lang.Character> matcher) 

Allows creating custom argument matchers.

static java.lang.String

contains(java.lang.String substring) 

String argument that contains the given substring.

static double

doubleThat(org.hamcrest.Matcher<java.lang.Double> matcher) 

Allows creating custom argument matchers.

static java.lang.String

endsWith(java.lang.String suffix) 

String argument that ends with the given suffix.

static boolean

eq(boolean value) 

boolean argument that is equal to the given value.

static byte

eq(byte value) 

byte argument that is equal to the given value.

static char

eq(char value) 

char argument that is equal to the given value.

static double

eq(double value) 

double argument that is equal to the given value.

static float

eq(float value) 

float argument that is equal to the given value.

static int

eq(int value) 

int argument that is equal to the given value.

static long

eq(long value) 

long argument that is equal to the given value.

static short

eq(short value) 

short argument that is equal to the given value.

static<T> T

eq(T value) 

Object argument that is equal to the given value.

static float

floatThat(org.hamcrest.Matcher<java.lang.Float> matcher) 

Allows creating custom argument matchers.

static int

intThat(org.hamcrest.Matcher<java.lang.Integer> matcher) 

Allows creating custom argument matchers.

static<T> T

isA(java.lang.Class<T> clazz) 

Object argument that implements the given class.

static java.lang.Object

not null argument.

static java.lang.Object

null argument.

static long

longThat(org.hamcrest.Matcher<java.lang.Long> matcher) 

Allows creating custom argument matchers.

static java.lang.String

matches(java.lang.String regex) 

String argument that matches the given regular expression.

static java.lang.Object

not null argument.

static<T> T

refEq(T value) 

Object argument that is reflection-equal to the given value.

static<T> T

same(T value) 

Object argument that is the same as the given value.

static short

shortThat(org.hamcrest.Matcher<java.lang.Short> matcher) 

Allows creating custom argument matchers.

static java.lang.String

startsWith(java.lang.String prefix) 

String argument that starts with the given prefix.

java.lang.Object類繼承的方法

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait




2.1.7 方法呼叫次數驗證

1. // 呼叫add一次   

2. mockedList.add("once");   

3.   

4. // 下面兩個寫法驗證效果一樣,均驗證add方法是否被呼叫了一次   

5. verify(mockedList).add("once");   

6. verify(mockedList, times(1)).add("once");  

驗證結果為: