7

Android サービス ( ) に加えている一連の変更をテストしようとしていますandroid.app.Service- 私は Dagger と Robolectric を使用しており、テスト範囲を縮小するために、サービス内のフィールド注入クラスをいくつかのモックに置き換える必要があります.. .それを(わずかに)より「ユニット」のようにします。

というわけでショートバージョン…

私はProviders.of(そこにGuice構文...)を挿入しますandroid.app.Service。単体テスト中にそれらを MockProviders に置き換えるにはどうすればよいですか?

ロングバージョンは…

関連するサービス コードは次のようになります。

@Inject SpotService spotService;
@Inject Provider<SynchroniseTidePosition> syncTidePosition;
@Inject Provider<SynchroniseSwellDataTask> syncBuoyData;
@Inject Provider<SynchroniseConditionsTask> syncConditionsData;
@Inject SpotRatingCalculator spotRatingCalculator;
@Inject LocalBroadcastManager localBroadcastManager;
@Inject NotificationManager notificationManager;

/**
 * @see android.app.Service#onCreate()
 */
@Override
public void onCreate() {
  super.onCreate();
  inject(this);
...

したがって、通常の操作では、startService(intent)呼び出しによってサービスが依存関係を挿入できるようになり、問題onCreateはありません。

私のテストでは、注入されたProvidersget()呼び出しを Mockito モックに置き換えたいと考えています。私はDagger テストの例に従うことを試み、次のようなテスト モジュールを作成しました。

@Module(includes = OceanLifeModule.class,
        injects = {TestSynchronisationServiceNotifications.class},
        overrides = true)
  static class TestSynchronisationServiceNotificationsModule {
    @Provides LocalBroadcastManager provideLocalBroadcastManager() {
      return LocalBroadcastManager.getInstance(Robolectric.application);
    }
    
    @Provides NotificationManager providesNotificationManager() {
      return (NotificationManager) Robolectric.application.getSystemService(Context.NOTIFICATION_SERVICE);
    }
    
    @Provides SpotService provideSpotService() {
      return mock(SpotService.class);
    }
    
    @Provides SpotRatingCalculator provideSpotRatingCalculator() {
      return mock(SpotRatingCalculator.class);
    }
    
    @Provides SynchroniseTidePosition provideSyncTidePosition() {
      return mock(SynchroniseTidePosition.class);
    }
    
    @Provides SynchroniseConditionsTask provideSyncConditionsTask() {
      return mock(SynchroniseConditionsTask.class);
    }
    
    @Provides SynchroniseSwellDataTask provideSyncSwellDataTask() {
      return mock(SynchroniseSwellDataTask.class);
    }
  }

実際の Service コードが Provider を呼び出すと、 Mockitoget()モックが返されることを期待しています (これらは、テスト モジュール @Provides のモックです)。

これは起こっていません。私がここに向かっているアプローチの何が問題なのですか?

4

1 に答える 1