2014年10月1日 星期三

Android 單元測試 - AsyncTask

測試專案的時候,碰到了一個狀況

 public void testMethod() throws InterruptedException {

       //下行程式碼是AsyncTask
       doAsyncTask();
       //dothing

 }

private void doAsyncTask(){
        //網路連接,等待回傳值
        NetWork.connect(new Callback(){
               @Override
                public void success(){
                      
                }
                public void fail(){
                      assertTrue(false);
                }
         });
}

test case在還沒有跑完doAsyncTask裡的callback就結束了

猜想是因為testcase在執行完本身的執行緒後,沒有碰到例外就當做測試成功

但這樣無法測試到需要多執行緒的程式碼,於是需要有一個等待機制的工具讓test case等待callback測試結束再往下繼續執行

java 有一個類叫做 CountDownLatch,主要用處是等待其他執行緒做完工作後,通知現在的執行緒繼續做尚未做完的工作

使用方法為new CountDownLatch(1),在建構子設定等待次數,await()方法是在子執行緒開始後呼叫,主執行緒會等待CountDownLatch倒數結束,等子執行緒做完動作呼叫countDown方法,主執行緒會從await繼續往下執行


套用在要測試的程式裡就會是

public void testMethod() throws InterruptedException {
       CountDownLatch latch = new CountDownLatch(1); 
       //下行程式碼是AsyncTask
       doAsyncTask();
       //呼叫await後,程式會停在這一行等待倒數結束
       latch.await();
       //dothing
       

 }

private void doAsyncTask(){
        //網路連接,等待回傳值
        NetWork.connect(new Callback(){
               @Override
                public void success(){
                      //當成功後,呼叫倒數加1,會通知latch檢查有沒有結束倒數
                      latch.countDown();
                }
                public void fail(){
                      assertTrue(false);
                }
         });
}

沒有留言:

張貼留言