我正在为我的 Android 项目编写一个非常简单的单元测试用例,测试用例简单地执行一个AsyncTask
在后台进行网络操作的测试用例。我正在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
它永远不会被调用,为什么以及如何修复它?
========更新==========
在我添加Thread.sleep(30*1000)
为最后一行之后runTest()
,我可以看到更多来自网络操作的日志。它证明teardown()
在我的网络操作完成之前调用了。我在 Android 测试框架 tearDown() 中什么也没做。自动调用它。
似乎我的使用等待通知CountDownLatch
不起作用......为什么?