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