測試框架Mockito使用筆記


Mockito,測試框架,語法簡單,功能強大!
靜態、私有、構造等方法測試需要配合PowerMock,PowerMock有Mockito和EasyMock兩個版本,語法相同,本文只介紹Mockito.

測試對像:ArticleManager

ArticleManager 類

public class ArticleManager {
    void setDatabase(ArticleDatabase database) {... }
    String get(String val){
        database.get(val);    
    }
    String add(String val){
        database.set(val);    
    }
}

ArticleDatabase 類

public class ArticleDatabase {
    String get(String val){...}
    String add(String val){...}
}

注解

@Mock

創建Mock對像

@Mock
private ArticleDatabase ds;

實例ds是一個虛擬對像,ds對像本身的所有方法返回值都為Null。

@InjectMocks

@InjectMocks
private ArticleManager articleManager;

將現有Mock對像(ds)注入到articleManager,支持方法包括constructor, setter, property 和 Spring的@Autowired !

@Captor

參數調用截取器

//定義@Captor,如果要獲取多個參數, 需要定義多個@Captor
@Captor
private ArgumentCaptor<String> argumentString;
articleManager.add("content");
verify(ds, times(1)).add(argumentString.capture());
//打印參數值
logger.debug(argumentString.getValue());

@Spy

Mock類的部分真實或定制后調用。沒有定制的方法就調用真實的方法。

@Spy 
private ArticleManager articleManager2;
//定制方法,這個地方用`when`還會調用真實的方法后返回定制結果
//見:http://docs.mockito.googlecode.com/hg/latest/org/mockito/Spy.html
doReturn("0").when(articleManager2).get(0);
articleManager2.get(0);
verify(articleManager2).get(0);
//調用真實的方法
articleManager2.get(1)
verify(articleManager2).get(1);

@Spy真實調用也可以用@Mock對像thenCallRealMethod方法調用:

when(articleManager2.get(2)).thenCallRealMethod();

Stubbing

特別制定Mock對像某方法的返回值、類型或異常等,默認是Null,

when(ds.get(0)).thenReturn("first");
when(ds.get(1)).thenThrow(new RuntimeException());

verify

對某方法返回結果的校驗,包括調用次數,返回值等

articleManager.add("one");
verify(ds).add("one");

參考:@Captor

模糊匹配

在Stubbing或verify里可用模糊匹配來適配多種情況的調用,Mockito在包org.mockito.Matchers下提供有anyString(), anyInt()或者直接anyObject()等大量模糊匹配函數,如果有需要還可自己寫,實現(org.hamcrest.Matcher)。 例:

when(articleManager.get(anyString())).toReturn("element");
System.out.println(articleManager.get("1"));
verify(articleManager).get(anyString());

在使用校驗函數verify時,參數如果有模糊匹配則所有參數都要用模糊匹配,如:

//正確的寫法:
verify(mock).articleManager(anyInt(), anyString(), eq("third argument"));
//錯誤用法:
verify(mock).articleManager(anyInt(), anyString(), "third argument");

更多模糊匹配函數請參考:http://mockito.googlecode.com/svn/branches/1.8.5/javadoc/org/mockito/Matchers.html

參考地址:

mockito home
mockito docs


免責聲明!

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



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