android單元測試框架Mockito使用

單元測試,早些年時常聽到這個概念,真的有去做的確實少,基本都是自己功能上的測試,開發完測試跑一邊沒啥問題就發佈了。這幾天花了點心思看了下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發現報錯
android單元測試框架Mockito使用
爲啥呢,因爲你要驗證的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結果爲-》成功
android單元測試框架Mockito使用
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結果爲android單元測試框架Mockito使用
程序走過了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());

    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章