使用Dagger在测试期间用Mockito模拟替换提供者注射

Oce*_*ife 6 android android-testing dagger

我正在尝试测试我正在对我的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);
...
Run Code Online (Sandbox Code Playgroud)

因此,在正常操作下,startService(intent)调用允许服务注入它的依赖关系,onCreate并且我们都很好.

根据我的测试,我想用Mockito模拟替换注入的Providers 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);
    }
  }
Run Code Online (Sandbox Code Playgroud)

我期待当我的实际服务代码调用Provider时,get()我将获得Mockito模拟(这些是我的测试模块@Provides的模拟).

这不会发生.我正在这里采取的方法出了什么问题?

Jes*_*son 3

自己做Providers.of()

public static <T> Provider<T> of(final T t) {
  return new Provider<T>() {
    public T get() {
      return t;
     }
  }
}
Run Code Online (Sandbox Code Playgroud)

Dagger 可能应该将其包含在测试模块中。