Mockito常用方法及示例


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
---------------------
作者:anlegor
來源:CSDN
原文:https://blog.csdn.net/Anlegor/article/details/44452011
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM