7

我正在尝试测试我正在对我的 Android 服务 ( android.app.Service) 所做的一系列更改 - 我正在使用 Dagger 和 Robolectric,我需要用一些模拟替换服务中的字段注入类以减少测试范围.. .make 它(稍微)更像“单位”。

所以,短版...

Providers.of在我的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,我们都很好。

在我的测试下,我想用 Mockito 模拟替换注入Provider的 s调用。get()我试图遵循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);
    }
  }

我期待当我的实际服务代码调用提供者时,get()我会得到Mockito 模拟(那些是我的测试模块@Provides 的模拟)。

这不会发生。我要去这里的方法有什么问题?

4

1 回答 1

3

Make your own Providers.of():

public static <T> Provider<T> of(final T t) {
  return new Provider<T>() {
    public T get() {
      return t;
     }
  }
}

Dagger should probably include this in a testing module.

于 2013-08-02T12:15:27.957 回答