2014-12-03 82 views
1

我正在測試我的服務類,它在Internet上獲取一些IP。我寫過這樣的測試:Android測試用例等待回調

TestTryoutTestService webServices = new TestTryoutTestService(ENDPOINTESTURL); 
    TestService adapter = webServices.getWebservice(); 
    adapter.getIpAsync(mCallback); 
    try { 
     Thread.sleep(2000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    assertEquals("IP is not equal", result, "1"); 
} 

Callback<TestResponse> mCallback = new Callback<TestResponse>() { 
    @Override 
    public void success(TestResponse testResponse, Response response) { 
     result = testResponse.getIp(); 
    } 

    @Override 
    public void failure(RetrofitError error) { 
     fail(); 
    } 
}; 

問題是我的Thread.sleep很短,我認爲它很醜。所以我的問題是如何在測試用例中等待回調結果?

編輯:

測試運行與robolectric。即使線程睡了10000,它的nenets也會進入回調。 http通過線框存根,如果沒有完成異步,它就可以工作。

stubFor(get(urlMatching("/ip/.*")) 
      .atPriority(5) 
      .willReturn(aResponse() 
          .withStatus(200) 
          .withBodyFile("ip_response.json") 
      )); 

回答

1

可以使用Countdown Latch做到這一點

CountDownLatch latch = new CountDownLatch(1); 

{ 
    ... 
    TestTryoutTestService webServices = new TestTryoutTestService(ENDPOINTESTURL); 
    TestService adapter = webServices.getWebservice(); 
    adapter.getIpAsync(mCallback); 
    latch.await(2000, TimeUnit.MILLISECONDS); 
    assertEquals("IP is not equal", result, "1"); 
} 

Callback<TestResponse> mCallback = new Callback<TestResponse>() { 
    @Override 
    public void success(TestResponse testResponse, Response response) { 
     result = testResponse.getIp(); 
     latch.countDown(); 
    } 

    @Override 
    public void failure(RetrofitError error) { 
     fail(); 
    } 
}; 

確保您的結果被聲明爲volatile或你可能看不到在線程之間的變化。 對於更復雜的問題,考慮使用Future(另請參閱它的FutureTask impl),它會在您將結果返回給調用線程時處理線程可見性問題。

編輯:關於你的更新,是不是進入回調肯定,或只是沒有更新結果?試着讓它像上面那樣易變,還要添加記錄/斷點來檢查輸入的回調。

+0

發現問題。我還需要設置執行器在我的Retro restadapter中,如下所示:.setExecutors(AsyncTask.THREAD_POOL_EXECUTOR,AsyncTask.THREAD_POOL_EXECUTOR) – user1007522 2014-12-08 08:07:08