Mockito常用方法及樣本

來源:互聯網
上載者:User

Mockit是一個開源mock架構,官網:http://mockito.org/,源碼:https://github.com/mockito/mockito

要使用Mockit,首先需要在我們工程中引入對應的jar包,對於maven工程而言,需要添加如下依賴項即可:

<dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><version>2.0.5-beta</version></dependency>
而在我們實際使用時,為了組織測試case的需要,我們可能還需要testng:

<dependency><groupId>org.testng</groupId><artifactId>testng</artifactId><version>6.8.8</version><scope>test</scope></dependency>

在進行下面的mock test樣本之前,我們先建兩個簡單的被測類Demo、ParameterClass。

Demo.java:

package com.anlegor.test;public class Demo {private String name ="laowang";private int age;public Demo(String name, int age) {this.name = name;this.age = age;}public String speak(String str) {return str;}public String talk(String str){return str;}public String methodNoParameters(){return name;}public String methodCustomParameters(ParameterClass parameter,String str){return str;}public String methodHaveChildObj(ParameterClass parameter,String str){parameter.childTalk(str);return str;}}

ParameterClass.java

package com.anlegor.test;public class ParameterClass {public ParameterClass() {}public String childTalk(String str){return str;}}

我們在進行mock的時候,常見會有如下一些情境:

1、 構造無參函數的返回

/** * 測試無參數函數mock */@Test(priority=0)public void testReturnDirect(){String mocked = "mocked Return";Demo demo  = Mockito.mock(Demo.class);Mockito.when(demo.methodNoParameters()).thenReturn(mocked);Assert.assertEquals(demo.methodNoParameters(), mocked);}

2、構造有基本類型作為參數的返回

/** * 測試任意基本型別參數函數mock */@Test(priority=1)public void testMethodWithParameter(){String word= "mocked Return";Demo demo =  Mockito.mock(Demo.class);Mockito.when(demo.speak(Mockito.anyString())).thenReturn(word);Assert.assertEquals(demo.speak("你好"), word);}

3、構造有基本類型作為參數,但是只針對特定參數輸入才mock傳回值

/** * 測試特定參數mock */@Test(priority=2)public void testMethodWithSpecificParameter(){String word= "mocked Return";Demo demo =  Mockito.mock(Demo.class);Mockito.when(demo.speak(Mockito.matches(".*大爺$"))).thenReturn(word);Assert.assertEquals(demo.speak("隔壁李大爺"), word);}

4、構造自訂類作為函數參數的返回,這種情況稍微複雜一些,需要實現一個matcher類

/** * 測試自訂型別參數的mock */@Test(priority=3)public void testMethodWithCustomParameter(){String word= "mocked Return";Demo demo =  Mockito.mock(Demo.class);Mockito.when(demo.methodCustomParameters(Mockito.argThat(new IsParameterClass()),Mockito.anyString())).thenReturn(word);Assert.assertEquals(demo.methodCustomParameters(new ParameterClass(), "你猜"), word);}//自訂一個與之匹配的matcher類class IsParameterClass extends ArgumentMatcher<ParameterClass> {    public boolean matches(Object para) {        return para.getClass() == ParameterClass.class;    } }

5、構造null返回

/** * 測試mock的函數返回null */@Test(priority=4)public void testMethodWithReturnNull(){String word= "mocked Return";Demo demo =  Mockito.mock(Demo.class);Mockito.when(demo.speak(Mockito.anyString())).thenReturn(null);Assert.assertNotEquals(demo.speak("你猜"), word);}

6、構造mock的函數拋出異常,當然我們可以在testng中設定expectedExceptions以顯示聲明會拋出指定類型的異常,這樣該條case執行的時候就會成功

/** * 測試mock的函數拋出異常 */@Test(expectedExceptions=org.mockito.exceptions.base.MockitoException.class,priority=5)public void testMethodReturnException(){String word= "mocked Return";Demo demo =  Mockito.mock(Demo.class);Mockito.when(demo.speak(Mockito.anyString())).thenThrow(new Exception());demo.speak("你猜");}

7、某些反覆調用,我們希望對於每次調用都返回不同的mock值

/** * 測試mock的不同次調用返回不同的值 */@Test(priority=6)public void testMethodMultiDiffReturn(){String word= "mocked Return 0";String word1= "mocked Return 1";Demo demo =  Mockito.mock(Demo.class);Mockito.when(demo.speak(Mockito.anyString())).thenReturn(word).thenReturn(word1);Assert.assertEquals(demo.speak("你猜"), word);Assert.assertEquals(demo.speak("你猜"), word1);}

8、驗證函式執行是否經過了mock

/** * 驗證方法是否被mock且是否為所執行的參數調用 */@Test(expectedExceptions= org.mockito.exceptions.misusing.NotAMockException.class,priority=7)public void testMockedMethodRun(){String word= "mocked Return";Demo demo =  Mockito.mock(Demo.class);Mockito.when(demo.speak(Mockito.anyString())).thenReturn(word);Assert.assertEquals(demo.speak("你猜"), word);Mockito.verify(demo.speak("你猜"));//下面這個參數的方法調用並沒有被執行過,所以會拋出NotAMockException的異常Mockito.verify(demo.speak("nicai"));}

如果對於上面的反覆使用Mockito.when***的寫法很厭煩的話,就直接靜態匯入org.mockito.Mockito.*即可。

當然,mockito的作用也不僅僅如上面,更詳細的使用可以 參考它很詳細的協助文檔:

http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html





聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.