6

シナリオ:

アプリケーションの onClick ハンドラを単体テストしようとしています。Onclick は REST API に対して単純な検索を行い、結果を返し、UI を更新します。

詳細:

Onclick は AsyncTask を実行し、doInBackground は REST API にクエリを実行して結果を返します。onPostExecute は結果を取得し、新しい ListAdapter をデータと共に ListView に割り当てます。

問題:

onPostExecute は、同じ UI スレッド上にあり、呼び出しをブロックするため、テスト ランナーによって呼び出されません。これを処理するには、いくつかのパターンがあります。ただし、AsyncTask を Runnable に配置し、LatchCountdown を使用して結果を待つと、CalledFromWrongThread 例外が発生します。

UI の更新を行う AsyncTask を単体テストする良い解決策はありますか? または、実装できるよりテスト可能な設計ですか?

4

2 に答える 2

0

さて、私が思いついた解決策はこれです:

1.) 前後のイベントのリスナー インターフェイスを定義します。
2.) アクティビティにリスナーを実装します。 2.) リスナー
を受け入れ、'exec' で呼び出される内部 AsyncTask を持つタスク ラッパー クラスを定義します。
3.) 内部の AsyncTask は、onPreExecute および onPostExecute でリスナーに通知します
。 4.) 通知があると、Activity はその UI を更新します。

アクティビティでのテスト:
1.) ラッパー クラスから継承してシリアル バージョンを作成し、exec メソッドをオーバーライドして順番に実行します。
- タスクが開始されたことをリスナーに通知します。
- タスクを実行します。
- タスクが完了したことをリスナーに通知します。

タスクの非同期バージョンをテストするため。
1.) 単体テスト メソッドで CountdownLatch と Runnable を使用します。UI の更新は必要ないため、WrongThreadException は発生しません。

于 2012-11-16T19:30:45.063 に答える
0

Uiスレッドでテストを実行したい

runOnUiThread(new Runnable() {
   public void run() {
      onPostExecute(...)

  }
});
于 2012-11-16T14:56:35.083 に答える