首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用DaggerMock模拟依赖组件的依赖关系

用DaggerMock模拟依赖组件的依赖关系
EN

Stack Overflow用户
提问于 2017-11-29 11:44:18
回答 1查看 202关注 0票数 0

我想为一个应用程序编写Espresso测试,所以我尝试DaggerMock来模拟一些外部依赖,比如本地存储。

我的Dagger设置由一个带有3个模块(DatabaseModule、DataModule和ApplicationModule)的ApplicationComponent组成,对于屏幕( Fragment ),我想测试的还有另一个依赖于ApplicationComponent的组件。

到目前为止,我尝试的是:

代码语言:javascript
复制
@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中构建的:

代码语言:javascript
复制
@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);
}

}

还有依赖于FeedComponentApplicationComponent

代码语言:javascript
复制
@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值,并且通过在代码中使用断点,我可以看到值始终是假的:

代码语言:javascript
复制
    when(networkUtils.isOnline())
            .thenReturn(false);

但是对于localDataSource来说不是这样,虽然我声明了:

代码语言:javascript
复制
    when(localDataSource.getFeedSorted())
            .thenReturn(Flowable.just(feedList));

为了防止有帮助,我是这样从FeedComponent注入依赖关系的:

代码语言:javascript
复制
            DaggerFeedComponent.builder()
                .applicationComponent(MyApplication.getApplicationComponent())
                .feedPresenterModule(new FeedPresenterModule(this))
                .build()
                .inject(this);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-29 21:13:16

为什么在测试中使用两个DaggerMock规则?我认为您可以使用一个规则,比如在这个示例中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47552023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档