0

私のAndroidプロジェクトにはActivityがあります:

public MyActivity extends Activity{
    ...
    @Override
    protected void onStart() {
    super.onStart();
        Intent intent = new Intent(this, MyService.class)
        startService(intent);
    }
}

onStart()の で、私はMyActivityちょうど開始しMyServiceます。

私の単純なサービスは、電話の状態の変化をリッスンするために使用されます。

public MyService extends Service{
  @Override
  public int onStartCommand(Intent intent, int arg, int id) {
       super.onStartCommand(intent, arg, id);
       /*register a PhoneStateListener to TelephonyManager*/
       startToListenToPhoneState();// show Toast message for phone state change
       return START_STICKY;
  }
}

アプリを起動した後、電話をかけると、サービスは電話の状態の変化をリッスンし、トーストメッセージを表示します。

NEXTで、プロジェクトの単体テストを行うことにしたのでAndroidTestCase、テスト プロジェクトでを作成しました。

public class MySimpleTest extends AndroidTestCase{
   ...
   @Override
   protected void runTest() {
      //make a phone call
      String url = "tel:3333";
      Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse(url));
      mContext.startActivity(mIntent);
   }
}

上記のテスト ケースは、単に通話を開始するだけで、問題なく動作します。

ホーム ボタンを押してアプリをバックグラウンドに戻し、その後、テスト ケースを実行して通話を開始しますPhoneStateListener。サービス内の がまだ実行されてトースト メッセージが表示されることを期待していましたが、そうではありませんでした。 .

次に、テストケースでも開始またはバインドする MyService必要があることがわかりました。その後、テストケースを実行すると、PhoneStateListener からのトーストメッセージを確認できます。なぜですか? つまり、サービスがアプリでバックグラウンドで実行されているのに、実行時に定義された PhoneStateLister をトリガーするために、テスト ケースでサービスを開始またはバインドする必要があるのはなぜですか?MyServiceAndroidTestCase

4

1 に答える 1

0

Android ServiceTestCase のドキュメントには、次のように書かれています。

テスト ケースは、テスト メソッドのいずれかが startService(Intent) または bindService(Intent) を呼び出すまで、onCreate() の呼び出しを待機します。これにより、実行中のサービスをテストする前に、追加のフレームワークまたはテスト ロジックをセットアップまたは調整する機会が得られます。

AndroidTestCase は、制御された環境でアクティビティやサービスなどをテストできるフレームワークを提供するため、サービスとのやり取りをテストする前に、少なくともサービスを開始する必要があると思います。

参照: http://developer.android.com/reference/android/test/ServiceTestCase.html

于 2013-10-10T15:22:38.647 に答える