我正在尝试测试我正在为我的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
期间注入它的依赖关系,我们都很好。
根据我的测试,我想用Mockito模拟替换注入的Provider
s get()
来电。我试图遵循Dagger test example并创建一个看起来像这样的测试模块;
@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的模拟)。
这没有发生。我要走向这里的方法出了什么问题?
答案 0 :(得分:3)
制作自己的Providers.of()
:
public static <T> Provider<T> of(final T t) {
return new Provider<T>() {
public T get() {
return t;
}
}
}
Dagger应该将其包含在测试模块中。