單元測試,早些年時常聽到這個概念,真的有去做的確實少,基本都是自己功能上的測試,開發完測試跑一邊沒啥問題就發佈了。這幾天花了點心思看了下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());
}
}