国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

使用Retrofit和Mockito進行可靠的Android API測試

frank_fun / 1541人閱讀

摘要:解決這些問題并且練習這些調用的一個絕妙方法是,使用一個很好的一個測試雙庫通用程序。當服務器做出響應時,會使用響應數據執行回調方法。目前為止,的威力真的很贊。

測試與API交互的HTTP調用是一件令人生厭的復雜事情。測試一個真實的Web服務器時,一大堆問題隨之產生:脆性測試(brittle test,因為網絡或API本身的問題而導致的測試失敗)、速度減慢測試(slow test,每一次HTTP調用都要花費好幾秒)和不完全測試(“如何觸發一個速率限制越界用例?想一想,我只希望速率限制會起作用……”)。

像Android這樣的平臺HTTP理應是異步調用,問題會變得更加復雜。如果在這些測試組合中添加計時器,那么你就準備好在測試API調用上認輸吧。

解決這些問題并且練習這些HTTP調用的一個絕妙方法是,使用一個很好的Mockito(一個Java測試雙庫 double library)通用程序:ArgumentCaptor。

ArgumentCaptor與混合測試雙有幾分相似;有點類似存根(stub),也有點類似偵聽程序(spy),但不完全是其中任何一個。可以使用參數捕獲器捕獲并存儲傳給mock/stub的參數。然而這里真正的亮點是對捕獲的參數進行方法調用,對于像Retrofit回調有很大幫助。

譯注:Retrofit是一個Android & Java的類型安全REST客戶端。

有了Retrofit,我們可以發起一個API調用并提供一個回調方法。當服務器做出響應時,Mockito會使用響應數據執行回調方法。

下面這些代碼使用Github API查詢用戶代碼倉庫:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 getApi().repositories("swanson", new Callback>() { ? ????@Override ????public void success(List repositories, Response response) { ????????if (repositories.isEmpty()) { ??????????displaySadMessage(); ????????} ? ????????mAdapter.setRepositories(repositories); ????} ? ????@Override ????public void failure(RetrofitError retrofitError) { ????????displayErrorMessage(); ????} });

這里有三個我們想要測試的用例:理想路徑(happy path,獲取一些代碼倉庫并把傳遞給適配器)、錯誤路徑(error path,向用戶提示服務器錯誤)、特殊用例(special case, 向用戶提示沒有代碼倉庫錯誤)。

如果你的測試依賴于在真實的API服務器,那么第二和第三個用例會很復雜。我了解到最近GitHub有一些DDOS問題,但你肯定不能依賴它們來測試你的錯誤用例!

然而我們可以通過ArgumentCaptor捕獲回調參數,進而完全控制發送的數據。

看一下對理想路徑的測試(我用的是Robolectri,建議你也嘗試一下):

1 2 3 4 5 6 7 8 9 Mockito.verify(mockApi).repositories(Mockito.anyString(), cb.capture()); ? List testRepos = new ArrayList(); testRepos.add(new Repository("rails", "ruby", new Owner("dhh"))); testRepos.add(new Repository("android", "java", new Owner("google"))); ? cb.getValue().success(testRepos, null); ? assertThat(activity.getListAdapter()).hasCount(2);

captor(cb)捕獲到回調,調用getValue()方法以后,通過success方法向它傳遞一些偽對象(dummy object)。

你可能會感嘆“啊哈(原來可以這么簡單)”。呵呵,如果沒有也沒關系。接下來可以看一下對錯誤路徑的測試:

1 2 3 4 5 Mockito.verify(mockApi).repositories(Mockito.anyString(), cb.capture()); ? cb.getValue().failure(null); ? assertThat(ShadowToast.getTextOfLatestToast()).contains("Failed");

像之前一樣,我們捕獲了回調。但是這一次我們調用了failure方法,它模擬了一個API錯誤。如果我們需要更有針對性的錯誤處理(例如:如果返回狀態是401,就重定向再登陸;如果是500, 彈出一條普通的系統錯誤消息),可以通過創建合適RetrofitError對象作為failure調用的參數。

目前為止,ArgumentCaptor的威力真的很贊。我們完全控制了捕獲到的對象,并且能夠給這些對象設置任意的數據或者觸發任意想要測試的錯誤。

為了讓內容更加豐富,下面是對一個特殊用例的測試:

1 2 3 4 5 6 7 8 Mockito.verify(mockApi).repositories(Mockito.anyString(), cb.capture()); ? List noRepos = new ArrayList(); ? cb.getValue().success(noRepos, null); ? assertThat(ShadowToast.getTextOfLatestToast()).contains("No repos :("); assertThat(activity.getListAdapter()).isEmpty();

(你可以在GitHub上找到示例的全部源碼和工程文件)。

有一個特殊細節要注意:如果在聲明捕獲器時使用了Mockito注解,

1 2 @Captor private ArgumentCaptor>> cb;

請確保在設置中的某個地方添加了下面代碼:

1 MockitoAnnotations.initMocks(this);

這種測試方法完全符合書中提到的所有特點:快速、健壯、易于使用。我們還可以通過它很容易地測試項目中很少出現的邊緣情況(會話超時、服務器維護、特殊值),確保我們的應用正常運行。

雖然本文示例是專門針對某種棧(Android、Robolectric、Retrofit、Mockito),但是類似的方法幾乎適用于任何應用。

祝測試愉快!


原文 Reliable API testing for Android with Retrofit and Mockito
翻譯 Peter Pan
via www.importnew

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/8680.html

相關文章

  • Android單元測試 - 如何開始?

    摘要:寫單元測試時,應該把這些依賴隔離,讓每個單元保持獨立。以上的各種原因,都會影響單元測試的結果。在單元測試的基礎上,將相關模塊組合成為子系統或系統進行測試,稱為集成測試。可以看到,單元測試速度比集成測試,也叫測試要快,并且開發成本也是最低。 showImg(/img/remote/1460000006811144); 原文鏈接:http://www.jianshu.com/p/bc996...

    Developer 評論0 收藏0
  • Android單元測試Mockito淺析

    摘要:寫在前面因個人能力有限,可能會出現理解錯誤的地方,歡迎指正和交流關于單元測試通常一個優秀的開源框架,一般都會有很完善的單元測試。 寫在前面 因個人能力有限,可能會出現理解錯誤的地方,歡迎指正和交流! 關于單元測試 通常一個優秀的開源框架,一般都會有很完善的單元測試。 舉個例子: showImg(/img/remote/1460000006767410); 不好意思,我調皮了 :) R...

    alexnevsky 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<