天天看點

在Android上測試異步任務

publicclassmymanagertestextendsactivitytestcase{

publicmymanagertest(stringname){

super(name);

}

protectedvoidsetup()throwsexception{

super.setup();

protectedvoidteardown()throwsexception{

super.teardown();

publicvoidtestdummytest(){

fail("failingtest");

  大多數的manager集中執行http請求是要從背景擷取資料。例如,我們用下面的代碼來執行使用者的登入:

mloginmanager.performloginwithusername("username","password",newonloginlistener(){

@override

publicvoidonfailure(throwablethrowable){

fail();

override

publicvoidonsuccess(usercustomer){

//..

});

  應用到我們自己的測試集合後,當得到預期之外的結果時,隻是讓這一結果失敗。我們可以看到為什麼在onfailure()函數中我們調用了fail()。接下來,即使我用一個錯誤的使用者名也能通過這個測試。思前想後,測試似乎是按照代碼順序執行的,但并沒有等到回調函數的結果傳回再向下執行。

  這顯然不是一個好方法。因為現在的程式經常通過異步任務和回調方法從背景擷取資料。嘗試uithread測試仍然不行。

  最後,我發現下面這種方法可以行得通。隻是用簡單的countdownlatch信号對象來實作wait-notify機制(你也可以用syncronized(lock){...lock.notify();},隻是這樣代碼并不美觀而已)

  那麼之前的代碼就變成了下面的模樣:

finalcountdownlatchsignal=newcountdownlatch(1);

signal.countdown();

signal.await();

最新内容請見作者的github頁:http://qaseven.github.io/