C同學的工作筆記 Mockito模擬測試框架學習筆記(一)

因爲不知道是不是需要補充說明,所以就先在標題上加(一)了


好了,首先說目的吧


說實話前端工程師在跟接口交互時確實是個麻煩事,不管是開發中還是後期的測試維護,畢竟影響的因素太多


例如前臺需要的各種不同情況的模擬,多種類別的數據,甚至是多種網絡情況的模擬,不論對前臺還是後臺都是麻煩事 ,要爲此耽擱雙方大量的時間


然後我們的技術總監就推薦了這個,查了查確實是好評一片,不過看了幾個教程都不太懂,有個好的,還是純英文的 http://www.vogella.com/tutorials/Mockito/article.html


就在此記錄下學習過程,對其他初學者也能有所幫助,同時也希望有大牛看出錯誤或有所指點,裏面好多東西我都是似懂非懂。。。


然後首先就是引用方法,3種,maven,gradle,或者自己去下載包,在此就主要說gradle了


官方的是

dependencies {
    // the following is required to use Mockito and JUnit for your 
    // instrumentation unit tests on the JVM
  androidTestCompile 'junit:junit:4.12'
    androidTestCompile 'org.mockito:mockito-core:1.+'
    androidTestCompile 'com.android.support.test:runner:0.3'
    androidTestCompile "com.google.dexmaker:dexmaker:1.2"
    androidTestCompile "com.google.dexmaker:dexmaker-mockito:1.2"
    
    // the following is required ot use Mockito and JUnit for your unit
    // tests on the JVM
    testCompile 'junit:junit:4.12'
    testCompile 'org.mockito:mockito-core:1.+'
   
}


作爲一個gradle初學者,對於androidTestCompile 和testCompile 不太瞭解,也沒有在程序中建立測試目錄


這個博客倒是不錯 http://blog.csdn.net/maosidiaoxian/article/details/42023609,不過也沒搞懂


進度比較緊,所以先就這樣了:

dependencies {
    compile 'junit:junit:4.12'
    compile 'org.mockito:mockito-core:1.+'
    compile "com.google.dexmaker:dexmaker:1.2"
    compile "com.google.dexmaker:dexmaker-mockito:1.2"
} 


不知道有木有問題。。。總之下一步!


然後就是測試代碼了


首先先建立一個測試類

<pre style="background-color:#2b2b2b;color:#a9b7c6;font-family:'宋體';font-size:9.0pt;"><span style="color:#629755;"><em>/**
</em></span><span style="color:#629755;"><em> * Mockito測試類
</em></span><span style="color:#629755;"><em> *
</em></span><span style="color:#629755;"><em> * Created by chenhaowen on 2015/7/21.
</em></span><span style="color:#629755;"><em> */
</em></span><span style="color:#cc7832;">public interface </span>SuperMockitoDAL {

    <span style="color:#629755;"><em>/**
</em></span><span style="color:#629755;"><em>     * 獲得基礎信息
</em></span><span style="color:#629755;"><em>     * */
</em></span><span style="color:#629755;"><em>    </em></span>String <span style="color:#ffc66d;">getNormalData</span>()<span style="color:#cc7832;">;
</span><span style="color:#cc7832;">
</span><span style="color:#cc7832;">    </span><span style="color:#629755;"><em>/**
</em></span><span style="color:#629755;"><em>     * 獲得特殊信息
</em></span><span style="color:#629755;"><em>     * */
</em></span><span style="color:#629755;"><em>    </em></span>String <span style="color:#ffc66d;">getSpecialData</span>()<span style="color:#cc7832;">;
</span><span style="color:#cc7832;">
</span><span style="color:#cc7832;">    </span><span style="color:#629755;"><em>/**
</em></span><span style="color:#629755;"><em>     * 獲得失敗信息
</em></span><span style="color:#629755;"><em>     * */
</em></span><span style="color:#629755;"><em>    </em></span>String <span style="color:#ffc66d;">getFailData</span>()<span style="color:#cc7832;">;
</span><span style="color:#cc7832;">
</span><span style="color:#cc7832;">    </span><span style="color:#629755;"><em>/**
</em></span><span style="color:#629755;"><em>     * 獲得特殊失敗信息
</em></span><span style="color:#629755;"><em>     * */
</em></span><span style="color:#629755;"><em>    </em></span>String <span style="color:#ffc66d;">getSpecialFaillData</span>()<span style="color:#cc7832;">;
</span><span style="color:#cc7832;">
</span><span style="color:#cc7832;">
</span>}


這個很簡單,加入了獲取數據的幾種情況

然後創建一個實體類實現它

import static org.mockito.Mockito.*;
/**
 * 演示參考類
 *
 * Created by chenhaowen on 2015/7/21.
 */
public class TestDAL implements SuperMockitoDAL{

    static TestDAL testDAL;

    public static TestDAL getInstance(){
        /**
         * 生成實例
         * */
        testDAL = mock(TestDAL.class);

        /**
         * 設置測試事件條件及返回值
         * */
        when(testDAL.getNormalData()).thenReturn("NormalData One").thenReturn("NormalData Two");
        when(testDAL.getSpecialData()).thenReturn("SpecialData");
        when(testDAL.getFaillData()).thenReturn("FaillData");
        when(testDAL.getSpecialFaillData()).thenReturn("SpecialFaillData");

        return testDAL;
    }

    @Override
    public String getNormalData() {
        return null;
    }

    @Override
    public String getSpecialData() {
        return null;
    }

    @Override
    public String getFaillData() {
        return null;
    }

    @Override
    public String getSpecialFaillData() {
        return null;
    }
}

OK,這樣就基本完成了,然後我解釋一下哈

  testDAL = mock(TestDAL.class);


這個就是實例這個測試類的方法,但不是一般的實例,調用mock後,我們可以在後面加入具體的邏輯


簡單來說,就是調用這個類相應方法的時候,給與相應的值


觸發條件的設置使用when方法,例如when(testDAL.getNormalData()) 就是指調用testDAL.getNormalData()方法的時候


然後通過 thenReturn 方法設置返回值,這裏的返回值類型並不侷限於String,可以自由設置


when(testDAL.getNormalData()) .thenReturn ("NormalData");

就是指,當testDAL調用getNormalData()方法時,就返回給它"NormalData"


同時,thenReturn 是可以疊加的,例如:

when(testDAL.getNormalData()).thenReturn("NormalData One").thenReturn("NormalData Two");
就是指第一次調用時,返回“NormalData One”,第二次調用時返回“NormalData Two”


簡單的各種情況的模擬就這樣了,調用它的方法就是:

/**
 * 生成實例
 * */
TestDAL testDAL = TestDAL.getInstance();

Toaster.showLong(getActivity(), "getNormalData 1: " + testDAL.getNormalData() +
        "\ngetNormalData 2:" + testDAL.getNormalData() +
        "\ngetSpecialData:" + testDAL.getSpecialData() +
        "\ngetFaillData:" + testDAL.getFaillData() +
        "\ngetSpecialFaillData:" + testDAL.getSpecialFaillData());


你只用把它寫進你的接口請求數據返回裏就可以了



基本的就是這樣了,但是像assertEquals、assertNotNull、verify之類的方法,還是不知道怎麼用,這些方法既沒有返回值,也沒有輸出,我怎麼樣知道結果呢?


還有像超時、慢速之類的,又要如何測試呢?









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