我想为一个应用程序编写Espresso测试,所以我尝试DaggerMock来模拟一些外部依赖,比如本地存储。
我的Dagger设置由一个带有3个模块(DatabaseModule、DataModule和ApplicationModule)的ApplicationComponent组成,对于屏幕( Fragment ),我想测试的还有另一个依赖于ApplicationComponent的组件。
到目前为止,我尝试的是:
@Rule public DaggerMockRule<ApplicationComponent> daggerRule =
new DaggerMockRule<>(ApplicationComponent.class, new DatabaseModule(), new DataModule(application),
new ApplicationModule(application)).set(
component -> {
MyApplication app =
(MyApplication) InstrumentationRegistry.getInstrumentation()
.getTargetContext()
.getApplicationContext();
app.setComponent(component);
});
@Rule
public final DaggerMockRule<FeedComponent> rule = new DaggerMockRule<>(
FeedComponent.class, new FeedDataSourceModule(),
new FeedDownloadImageUseCaseModule(), new FeedServiceModule(), new FeedPresenterModule(null))
.addComponentDependency(ApplicationComponent.class, new DatabaseModule(), new DataModule(application), new ApplicationModule(application))
.set(component -> localDataSource = component.localDataSource());
@Mock FeedDao feedDao;
@Mock NetworkUtils networkUtils;
@Mock FeedLocalDataSource localDataSource;其中localDataSource实际上是我想要模拟的依赖项,它是在FeedDataSourceModule中构建的:
@Module
public class FeedDataSourceModule {
@Provides
@FragmentScope
public FeedItemMapper providesFeedItemMapper() {
return new FeedItemMapper();
}
@Provides
@FragmentScope
public FeedLocalDataSource providesFeedLocalDataSource(FeedDao feedDao, FeedRequestDetailsDao detailsDao, FeedItemMapper mapper) {
return new FeedLocalDataSourceImpl(feedDao, detailsDao, mapper);
}
@Provides
@FragmentScope
public FeedRemoteDataSource providesFeedRemoteDataSource(FeedService feedService, FlagStateService flagStateService,
@Named("Api-Token") String apiToken, @Named("Screen-Size") String screenSize,
@Named("Account-Id") String accountId) {
return new FeedRemoteDataSourceImpl(feedService, flagStateService, apiToken, screenSize, accountId);
}
}还有依赖于FeedComponent的ApplicationComponent:
@FragmentScope
@Component( dependencies = ApplicationComponent.class,
modules = {
FeedPresenterModule.class,
FeedServiceModule.class,
FeedDataSourceModule.class,
FeedDownloadImageUseCaseModule.class})
public interface FeedComponent {
@Named("Api-Token") String getApiToken();
@Named("Api-Key") String getApiKey();
FeedLocalDataSource localDataSource();
FeedRemoteDataSource remoteDataSource();
void inject(FeedFragment feedFragment);
}通过上面发布的两个@Rules,我可以确认NetworkUtils似乎确实被正确地模仿了,因为我使用了Mockito.when()来返回false值,并且通过在代码中使用断点,我可以看到值始终是假的:
when(networkUtils.isOnline())
.thenReturn(false);但是对于localDataSource来说不是这样,虽然我声明了:
when(localDataSource.getFeedSorted())
.thenReturn(Flowable.just(feedList));为了防止有帮助,我是这样从FeedComponent注入依赖关系的:
DaggerFeedComponent.builder()
.applicationComponent(MyApplication.getApplicationComponent())
.feedPresenterModule(new FeedPresenterModule(this))
.build()
.inject(this);发布于 2017-11-29 21:13:16
为什么在测试中使用两个DaggerMock规则?我认为您可以使用一个规则,比如在这个示例中。
https://stackoverflow.com/questions/47552023
复制相似问题