2012-03-14 41 views
6

私のテストは、AsyncTaskに焦点を当て、後続のアクティビティが完了したことを確認して検証します。ActivityUnitTestCaseとActivity#runOnUiThread

AsyncTaskがインスタンス化されてUIスレッドから実行されない限り、AsyncTask#onPostExecuteは呼び出されないため、AsyncTaskを呼び出すmy(テスト可視)メソッドは、この動作を保証するための必要な予防策を実行します。 UIスレッド上で実行されるか、UIスレッド上で実行されるようにスケジュールされている場合は直ちに実行されます。

ActivityUnitTestCaseテストからこのメソッドが呼び出されると、このAsyncTaskをインスタンス化して実行するRunnableが、runOnUiThreadアクティビティ経由で、UIスレッド以外のスレッドで実行を終了します。 このRunnableがアクティビティ内のUIスレッドで確実に実行されるようにする方法はありますか?

補遺:

  • テストがActivityInstrumentationTestCase2 クラスの下に望んだとして実行されますが、私は ActivityUnitTestCase#getStartedActivityIntentにアクセスすることはできません。私は Instrumentation.ActivityMonitorを認識しており、それは非解決策です。
  • ActivityUnitTestCaseでスケジュールされた実行可能ファイルrunTestOnUiThread doは、 スレッドで実行されます。
  • 私はテストを再定義するつもりはありません。
  • 奇妙なことに、ActivityUnitTestCase#startActivityはUIスレッドでアクティビティ#onCreateを呼び出します。

編集:ここでは、問題の本質を示している(未テスト)コードのビットがあります:

// ExampleActivityTests.java 

class ExampleActivityTests : public ActivityUnitTestCase <ExampleActivity> { 

    public void testThatRequiresUiThread() { 

     startActivity (new Intent(), null, null); 
     // ...call instrumentation onStart, onResume... 

     runTestOnUiThread(new Runnable() { 
      public void run() { 
       boolean isUiThread = Thread.currentThread() == Looper.getMainLooper().getThread(); 
       Log.d ("A", "Running on UI Thread? " + isUiThread); 
      } 
     }); 

     getActivity().methodRequiringUiThread(); 

     // assertions here... 
    } 
} 

// ExampleActivity.java -- just the relevant method 

    public void methodRequiringUiThread() { 

     runOnUiThread(new Runnable() { 
      public void run() { 
       boolean isUiThread = Thread.currentThread() == Looper.getMainLooper().getThread(); 
       Log.d ("B", "Running on UI Thread? " + isUiThread); 
      } 
     }); 
    } 

LogCatでは、我々が表示されます:

ActivityUnitTestCase#startActivity上の呼び出し
A | Running on UI Thread? true 
B | Running on UI Thread? false 
+1

添付する「すぐにUIスレッド上で実行される場合や、UIスレッド上で実行するようにスケジュールされていることをRunnableを経て、」_、より良い_あなたの文を読んで混乱少しあなたの問題を明確にするためのコードスニペット。 – yorkw

+0

その声明は実装をあまりに詳細に説明していたのかもしれません。単にAsyncTaskがUIスレッド上で作成されて実行されていることを家で確認するだけの目的でした。私は直面している問題を示すコードを追加することができますが、このアスペクトを省略して行います。 – Travis

答えて

4

UIスレッドは私の問題を解決します。

public void testThatRequiresUiThread() { 

    runTestOnUiThread(new Runnable() { 

     @Override 
     public void run() { 
      startActivity(new Intent(), null, null); 
     } 
    }); 

    // ... 
    getActivity().methodRequiringUiThread(); 

    // rest of test... 
} 

利回り

A | Running on UI Thread? true 
B | Running on UI Thread? true 
関連する問題