4

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が機能していないようです...なぜですか?

4

4 に答える 4

1

私は同じ問題を抱えていたので...これが私のために解決したものです。クラスに AndroidTestCase を拡張させる代わりに、InstrumentationTestCase を拡張させました。

次に、次のように asyncTask を開始します。

runTestOnUiThread(new Runnable()
    {
        @Override
        public void run()
        {
            startAsyncTask();
        }
    });
于 2013-10-29T08:25:16.947 に答える
0

doInBackground メソッドがこの問題の原因ではないことを確認してください。このサンプル タスクを試してください。そして、ログ結果を共有してください。

private class MyAsyncTask extends AsyncTask<String, Void, String> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        Log.i("Debug", "onPreExecute");
    }

    @Override
    protected String doInBackground(String... params) {
        Log.i("Debug", "doInBackground");
        return "operation finished";
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        Log.i("Debug", "onPostExecute");
        signal.countDown();
    }

    @Override
    protected void onCancelled() {
        super.onCancelled();
        Log.i("Debug", "onCancelled");
    }
}

編集:AndroidTestCase s とsを使用しているときに問題が発生する可能性があるのではないかと思いましたAsyncTask。あなたのコードを私のプロジェクトにコピーし、それをテストしましたAsyncTask(上記の私のタスクを参照してください)。の後に起動するたびにdoInBackgroundonPostExecuteメソッドが正常に呼び出されます。スリープ 2 分の長時間実行タスクをシミュレートし、それもonPostExecuteメソッドに入りました。の後に呼び出さtearDownれるメソッドonPostExecute

doInBackgroundしたがって、ここでの問題はおそらくメソッド内のループです。または、何らかの理由でキャンセルされ、タスクのonCancelledメソッドが呼び出されます。

于 2013-10-31T14:33:11.430 に答える
0

はのonPostExecute()呼び出し元スレッドで実行されることになっていますexecute()。そのスレッドが のような呼び出しによって中断された場合signal.await()、 はonPostExecute()実行できなくなります。signal.await()したがって、電話した後はできませんexecute()

于 2016-01-14T12:33:31.717 に答える
0

あなたのネットワーク操作は非常に時間のかかるプロセスだと思いますので、onPostExecute() メソッドを呼び出すことができないほど時間がかかります。

于 2013-10-28T13:27:40.463 に答える