2012-11-16 26 views
6

シナリオ:AsyncTaskとAndroidのユニットテストとUIのアップデートソリューション

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

詳細:

にOnclickはAsyncTaskを実行し、doInBackgroundは、REST APIを照会し、その結果を返します。 onPostExecuteは結果を受け取り、新しいListAdapterをデータと共にListViewに割り当てます。

問題:それは同じUIスレッドをブロックの上に呼び出しだから

onPostExecuteは、テストランナーでで呼び出されません。これに対処するためのパターンがいくつかあります。しかし、AsyncTaskをRunnableに配置し、LatchCountdownを使用して結果を待つと、CalledFromWrongThread例外が発生します。

UIアップデートを行うAsyncTaskの単体テストには良い解決策がありますか?それとも、私が実装できるよりテスト可能なデザインですか?

+0

これは、私にとってActivityInstrumentationTestCaseのように聞こえる... – dmon

+0

これはActivityInstrumentationTestCase2クラスで行われています。 – bcdennis72

+0

あなたのasynctaskはうまく動くはずです... – dmon

答えて

0

OKをテストを実行したいので、私が思いついた解決策はこれです:

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


1)をシーケンスで実行するexecメソッドをオーバーライドし、そこから継承することによってラッパークラスのシリアルバージョンを作成する:
- 開始としてリスナーにタスクを通知します。
- タスクを実行します。
- タスクが完了したことをリスナーに通知します。

タスクの非同期バージョンをテストします。
)1.ユニットテストメソッドでCountdownLatchとRunnableを使用します。 UIの更新が必要ないので、WrongThreadExceptionsはありません。

+0

あなたはおそらく同様のディスカッション[ここ](http://stackoverflow.com/questions/10491526/how-can-i-test-theボタンをクリックしてその変更をアクティビティビューのasy/10491965#10491965)と[here](http://stackoverflow.com/questions/8295003/best-way-to- as-asynctask/8317071#8317071からの進捗管理の管理)。 – yorkw