android單元測試框架Mockito使用
阿新 • • 發佈:2018-10-29
null 修改 分享 log hone 技術 pro 我們 ext 單元測試,早些年時常聽到這個概念,真的有去做的確實少,基本都是自己功能上的測試,開發完測試跑一邊沒啥問題就發布了。這幾天花了點心思看了下MockIto框架,記錄博文。
- MockIto官網文檔在https://static.javadoc.io/org.mockito/mockito-core/2.23.0/org/mockito/Mockito.html。
- MockIto框架是基於原生JUnit4,JUnit4是整個單元測試的基礎,他能夠幫我我們開發者更快,更高效的進行單元測試
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());
}
}
android單元測試框架Mockito使用