我正在尝试测试我正在对我的 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 的模拟)。
这不会发生。我要去这里的方法有什么问题?