gpt4 book ai didi

android - 在 Dagger 测试期间用 Mockito 模拟替换 Provider 注入(inject)

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:11:36 24 4
gpt4 key购买 nike

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

那么,简短的版本...

我将 Providers.of(那里有 Guice 语法...)注入(inject)到我的 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 期间注入(inject)它的依赖项,我们都很好。

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

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

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

最佳答案

制作你自己的Providers.of():

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

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

关于android - 在 Dagger 测试期间用 Mockito 模拟替换 Provider 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17982403/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com