2012-05-11 8 views
2

ActivityInstrumentationTestCase2を拡張してAndroid Activityテストケースを作成しています。オフロードをテストしているアクティビティは、ローダーに作用します。アクティビティ自体はLoaderCallbackです。ActivityInstrumentationTestCase2でローダーが終了するまでブロックします。

問題は、ローダーが作業を完了する前に(テストケース以外のローダーが明らかに実行されているため)テストケースが終了することです。ローダーの作業が終了するまで、テストケースをどのように待機させることができますか?

基本的なローダースレッドに参加することを考えました。しかし、私は基本的なスレッドにアクセスする方法を見つけることができないようです。また、Loaderスレッドがすぐに起動しない可能性があります。

もう1つは、テストケースにLoaderListenerを登録することでしたが、特定のLoaderが1つのLoaderListenerしか持てないようです。

+0

使用 'のThread.sleep()'で行うにいるもののために働きます私は別の同様の質問[ここ]で答えたサンプルコードをチェックしてください(http://stackoverflow.com/questions/10491526/how-can-i-test-the-result-of-a-button-click-that-アクティビティビュー-asy/10491965#10491965)。 – yorkw

+0

はい、それは私がやっていることですが、それは脆いようです。テストを実行しているマシンが遅すぎるため、テストが失敗する可能性があります。私はそれを行うための堅実な方法が欲しいです。 –

答えて

1

最大タイムアウトを設定できます。最大タイムアウトに達するまで、たびにローダーのヌル値を確認してください。 max timeoutが設定されると、ローダーがロードされないためテストが失敗します。

+0

あなたは精緻化できますか?ありがとう! – rciovati

0

mutexまたはReentrantLockを使用してください。

+1

投稿していただきありがとうございます!明確にするためにコードにコメントを追加できますか? –

0

テストケースが実行されているスレッドと、完了するのを待っているバックグラウンドスレッドまたはアクションとの間に、Java同期方式を使用する必要があります。

私はカウントダウンラッチを使用しました。テスト中のあなたのコードで

(私の場合は活動)

あなたの活動が

  • 民間最終たCountDownLatch信号=新たCountDownLatch(1)を作成したときにそれを初期化します。

ローダーが終了し、それが行われますあなたのコード信号があります。

  • signal.countDownを();

Iは試験

  • 公衆たCountDownLatchのgetsignal(){ 戻り信号の下に自分のコードにラッチするためのゲッターを提供します。テストで }

    は(バックグラウンドスレッドを開始する)活性を開始
    • MainActivity活性= getActivity()。
    • たCountDownLatch信号=活動に待つようにラッチを取得します。getSignal();
  • は(!signal.await(30、TimeUnit.SECONDS)){ が失敗(「時限アウトが完了するバックグラウンドタスクを待っているときにバックグラウンドタスクが
    • を終了するのを待ち、他のものを行います"); }

これは、バックグラウンドスレッド、あなたの活動ののonCreate()メソッドによって開始されAsyncTasks等...

関連する問題