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()では何もしませんでした。自動的に呼び出します。
私のwait-notify by usingCountDownLatch
が機能していないようです...なぜですか?