11

現在、Android アプリケーションの単体テストを作成していて、次の問題に遭遇しました。

を使用して、次のようServiceTestCaseにテストします。IntentService

@Override
public void setUp() throws Exception {
    super.setUp();      
}

public void testService()
{
    Intent intent = new Intent(getSystemContext(), MyIntentService.class);
    super.startService(intent);     
    assertNotNull(getService());        
}

ただし、自分IntentServiceが作成されていることに気付きました(onCreate呼び出されたことを意味します)が、への呼び出しを受け取ることはありませんonHandleIntent(Intent intent)

クラスですでにテストした人IntentServiceはいますか?ServiceTestCase

ありがとう!

4

5 に答える 5

6

これは少し遅いですが、私はこれに苦労しました。サービスの onStart を単純にオーバーライドして直接呼び出すクラスを作成することで、これを解決できますonHandleIntent。たとえば、LocationUpdaterService がある場合、次のonStartように関数をオーバーライドする偽のクラスを作成できます。

public class LocationUpdaterServiceFake extends LocationUpdaterService {

@Override
public void onStart(Intent intent, int startId) {
    onHandleIntent(intent);
    stopSelf(startId);
}

LocationUpdaterServiceは IntentService のサブクラスなので、テストを作成するときは、次のようにLocationUpdaterServiceFakeクラスを使用してください

public class LocationUpdateServiceTest extends ServiceTestCase<LocationUpdaterServiceFake> {

public LocationUpdateServiceTest()
{
    super(LocationUpdaterServiceFake.class);
}

public void testNewAreaNullLocation()
{
    Intent intent = new Intent();
    intent.setAction(LocationUpdaterService.ACTION_NEW_AREA);

    startService(intent);
}

}

を呼び出すたびにstartService、IntentService のスレッド コードをバイパスし、onHandleIntent関数を呼び出すだけになります。

于 2013-10-23T21:06:18.430 に答える
2

私は自分自身のテストを始めたばかりIntentServiceで、少し頭痛の種であることがわかっています。

まだ問題を解決しようとしていますが、メソッドへの呼び出しを受信して​​いないように見えるシナリオの場合onHandleIntent()(背後にある技術があまり得意ではないjunitので、用語の使用を許してください)、テスト フレームワークが原因である必要があります。コードに基づいて、への呼び出しがstartService返されたら、実際にテストメソッドを破棄または終了します。onHandleIntentがトリガーされるのに十分な時間がありません。

テスト ケースに無限ループを追加して、上記の理論を検証しました。そうして初めて、ログ ステートメントがonHandleIntentログに記録されます。

于 2011-08-12T13:48:40.797 に答える
0

次を追加するだけです。

Thread.sleep(XXXXXXX); 

XXXXstartServiceの後に を選択すると、スレッドがonHandleIntentメソッドに入ります。

于 2013-07-04T15:07:51.120 に答える
0

Android Studio 1.1 で、実行/デバッグ構成を使用してテストを実行する場合 | IntentService を拡張するユニット アンダー テスト コード (UUT) の Android テスト機能、ServiceTestCase.java (JUnit?) コードは UUT の onHandleIntent(Intent intent) メソッドを呼び出しません。ServiceTestCase は onCreate のみを呼び出すため、問題はテスト コードにあります。

protected void startService(Intent intent) {
    if (!mServiceAttached) {
        setupService();
    }
    assertNotNull(mService);

    if (!mServiceCreated) {
        mService.onCreate();
        mServiceCreated = true;
    }
    mService.onStartCommand(intent, 0, mServiceId);

    mServiceStarted = true;
}

私のファイル smSimulatorTest.java で:

public class smSimulatorTest extends ServiceTestCase<smSimulator> 

この時点で、IntentService がインスタンス化される方法であるため、Intents を介して UUT をテストするテスト フレームワークで他のソリューションを探しています。

http://developer.android.com/reference/android/app/IntentService.html - 使用するには、IntentService を拡張し、onHandleIntent(Intent) を実装します。IntentService はインテントを受け取り、ワーカー スレッドを起動し、必要に応じてサービスを停止します。

私は、他の人たちと同じように、上記のドキュメントの指示に従ってコードを onHandleintent() に入れましたが、ServiceTestCase は onStart のみをテストし、onStartCommand は上記に示されています。

于 2015-02-20T03:11:55.300 に答える
-1

これは今のところ私のアプローチです:

  1. サービスを呼び出す開始インテントは、テストする Service メソッドを指定します

    
    public void test_can_do_the_work() {
        Intent startIntent = new Intent();
        startIntent.putExtra("IN_TEST_MODE", "TEST_SPECIFIC_METHOD");
        startIntent.setClass(getContext(), MyServiceToTest.class);
        startService(startIntent);
        assertNotNull(getService()); // Your assertion Service specific assertion
    }
    
  2. サービス onStart では、渡された特定の Extra をチェックし、メソッドを呼び出してテストします。これは、Handle インテントが発生したときに実行されません。

    
    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        String in_test_mode = intent.getStringExtra("TEST_SPECIFIC_METHOD");
        if(in_test_mode != null){
            doServiceWork();
        }
    }
    
于 2014-11-19T18:08:09.533 に答える