我正在为我的Android项目编写一个非常简单的单元测试用例,测试用例简单地执行AsyncTask
,它在后台执行网络操作。我伸出AndroidTestCase
类为我的测试案例:AsyncTask的onPostExecute()永远不会在AndroidTestCase中调用
public class MyTest extends AndroidTestCase{
//use CountDownLatch to perform wait-notify behavior
private CountDownLatch signal;
@Override
public void setUp() throws Exception{
super.setUp();
//I use CountDownLatch to perform wait-notify behaviour
signal = new CountDownLatch(1);
}
@Override
public void runTest() throws Exception{
String params = "some params";
//MyAsyncTask does the networking tasks
new MyAsyncTask().execute(params);
//wait until MyAsyncTask is done
try {
signal.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private class MyAsyncTask extends AsyncTask<String, Void, String>{
@Override
protected String doInBackground(String... params) {
//Do networking task e.g. access a remote database
}
@Override
protected void onPostExecute(String result){
super.onPostExecute(result);
//this never get called when run this test case, why?
Log.i("Debug","post execute");
signal.countDown();
}
}
}
正如你看到的上面,我使用CountDownLatch执行等待通知行为。
MyAsicTask
后开始,我调用signal.await()
到等待为MyAsyncTask
完成。
在onPostExecute()
回调MyAsyncTask
,我打电话给signal.countDown()
通知任务已完成。
但是当我运行这个测试用例时,onPostExecute
是从来不叫的,为什么&如何解决呢?
========更新==========我在runTest()
添加Thread.sleep(30*1000)
作为最后一行
后,我可以看到从网络操作更加日志。它证明teardown()
在我的网络操作完成之前被调用。我在tearDown(),android测试框架中没有做任何事情。自动调用它。
看起来我的等待通知通过使用CountDownLatch
不工作...为什么?
doInBackground中的任何异常? – Triode
'doInBackground'可能有问题,因此'onPostExecute'没有得到调用。 – d3m0li5h3r
@ d3m0li5h3r除非doInbackground()崩溃并取消异步任务,否则onPostExecute()将无法执行。 –