單元測試,早些年時常聽到這個概念,真的有去做的確實少,基本都是自己功能上的測試,開發完測試跑一邊沒啥問題就發布了。這幾天花了點心思看了下MockIto框架,記錄博文。
1.在mvp的模式上,我們建立一個P層叫LuckinTestPresenter,大概流程為:注冊-》驗證此賬號是否允許注冊,允許-》注冊成功,具體為
/**
* 注冊賬號密碼
* @param phone 賬號
* @param passWord 密碼
*/
public void register(String phone, String passWord) {
System.out.println("到達register");
}
/**
* 驗證是否可以注冊
* @param phone
* @param passWord
*/
public void verification(String phone, String passWord) {
System.out.println("到達verification");
if (!isLimit()) {
register(phone, passWord);
}
}
/**
* 注冊之前檢查這個手機號是否被限制
* @return
*/
public boolean isLimit() {
return false;
}
2:我們現在要在單元測試中,驗證點擊注冊的時候程序是否有跑過verification方法,那么我們的單元測試案例為
public class LuckinPresenterTest {
@Test
public void check() {
//mockito會模擬LoginPresenterTest這個需要測試的class,返回一個LoginPresenterTest對象
LuckinTestPresenter luckinTestPresenter = Mockito.mock(LuckinTestPresenter.class);
//主動調用驗證方法
luckinTestPresenter.verification("2018091280", "word");
//現在我們要了利用MockIto驗證程序到這為止,是否走到了register(),方法如下
Mockito.verify(luckinTestPresenter).register("2018091280", "word");
}
}
run發現報錯
為啥呢,因為你要驗證的register()并沒有被調用,為啥呢,看程序,應該執行的呀,這里需要注意的就是所喲Mock標記的類都是虛擬的,返回值都是null,也就是說你無法用一個為null的對象去調用register方法。如果我就要這么做呢,那就用spy標注吧。修改案例改為:
public class LuckinPresenterTest {
@Test
public void check() {
//mockito會模擬LoginPresenterTest這個需要測試的class,返回一個LoginPresenterTest對象
LuckinTestPresenter luckinTestPresenter = Mockito.spy(LuckinTestPresenter.class);
//主動調用驗證方法
luckinTestPresenter.verification("2018091280", "word");
//現在我們要了利用MockIto驗證程序到這為止,是否走到了register(),方法如下
Mockito.verify(luckinTestPresenter).register("2018091280", "word");
}
}
run結果為-》成功
2:現在有一個需求,我要測試當我isLimit()返回都會true時程序有沒有走register,我又不想動原p層代碼,那咋辦呢,有辦法,我們修改為
public class LuckinPresenterTest {
@Test
public void check() {
//mockito會模擬LoginPresenterTest這個需要測試的class,返回一個LoginPresenterTest對象
LuckinTestPresenter luckinTestPresenter = Mockito.spy(LuckinTestPresenter.class);
//主動調用驗證方法
Mockito.when(luckinTestPresenter.isLimit()).thenReturn(true);//控住islimit返回true
luckinTestPresenter.verification("2018091280", "word");
//現在我們要了利用MockIto驗證程序到這為止,是否走到了register(),方法如下
Mockito.verify(luckinTestPresenter).register("2018091280", "word");
}
}
run結果為
程序走過了verification,之后報錯(就說明mock驗證失敗,程序沒有走到register方法,因為你已經把isLimit返回值設為了true)。
相關方法為:
public class LuckinPresenterTest {
@Test
public void check() {
//mockito會模擬LoginPresenterTest這個需要測試的class,返回一個LoginPresenterTest對象
LuckinTestPresenter luckinTestPresenter = Mockito.spy(LuckinTestPresenter.class);
//控住isTourise返回true
Mockito.when(luckinTestPresenter.isLimit()).thenReturn(true);
//主動驗證操作
luckinTestPresenter.verification("2018091280", "word");
//現在我們要了利用MockIto驗證程序到這為止,是否走到了register(),方法如下
Mockito.verify(luckinTestPresenter).register("2018091280", "word");
//驗證register的方法是否調用,并且是否為1次,并且參數一致
Mockito.verify(luckinTestPresenter, Mockito.times(1)).register("2018091280", "word");
//驗證register的方法從未調用過
Mockito.verify(luckinTestPresenter, Mockito.never()).register("2018091280", "word");
//驗證register的方法是否調用,并且是否為1次,參數忽略
Mockito.verify(luckinTestPresenter, Mockito.times(1)).register(Mockito.anyString(), Mockito.anyString());
}
} 免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。