2014-12-03 63 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