首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AndroidInjector和Espresso

AndroidInjector和Espresso
EN

Stack Overflow用户
提问于 2017-05-02 10:13:29
回答 2查看 878关注 0票数 4

使用AndroidInjector和子组件使得不可能将活动作用域对象注入到Espresso的测试类中。

以前,对于应用程序级组件和活动组件,只要您创建了一个继承了活动组件的测试组件,就可以对不是活动的测试类调用inject()。

示例:

活动组件

代码语言:javascript
复制
@ActivityScope
@Component(
    dependencies = ApplicationComponent.class,
    modules = {
            NowPlayingActivityModule.class
    })
public interface NowPlayingActivityComponent {
    void inject(NowPlayingActivity activity);
}

测试类组件

代码语言:javascript
复制
@ActivityScope
@Component(
    dependencies = TestApplicationComponent.class,
    modules = {
            TestNowPlayingActivityModule.class,
            ActivityModule.class
    })
 public interface TestNowPlayingActivityComponent extends NowPlayingActivityComponent {
    void inject(NowPlayingActivityTest nowPlayingActivityTest);
}

测试模块

代码语言:javascript
复制
@Module
public class TestNowPlayingActivityModule {
    private NowPlayingActivityModule nowPlayingActivityModule;

    public TestNowPlayingActivityModule(NowPlayingActivityModule nowPlayingActivityModule) {
        this.nowPlayingActivityModule = nowPlayingActivityModule;
    }

    @Provides
    @ActivityScope
    public ServiceGateway providesServiceGateway(ServiceApi serviceApi) {
        return nowPlayingActivityModule.providesServiceGateway(serviceApi);
    }

    @Provides
    @ActivityScope
    public NowPlayingPresenter providesNowPlayingPresenter(NowPlayingInteractor nowPlayingInteractor) {
        //In order to make sure espresso idles the view checks, we put the IdlingResource on the presenter.
        return Mockito.spy(new NowPlayingPresenterImpl_IdlingResource(nowPlayingActivityModule.getNowPlayingViewModel(),
            nowPlayingInteractor));
    }
}

在测试类中

代码语言:javascript
复制
TestNowPlayingActivityComponent mockNowPlayingActivityComponent = DaggerTestNowPlayingActivityComponent.builder()
            .testApplicationComponent((TestApplicationComponent) mvpExampleApplication.getComponent())
            .testNowPlayingActivityModule(new TestNowPlayingActivityModule(nowPlayingActivityModule))
            .build();

mockNowPlayingActivityComponent.inject((NowPlayingActivity) activity);
mockNowPlayingActivityComponent.inject(NowPlayingActivityTest.this);

人们如何访问自动生成的活动模块并在espresso UI Test中使用它们?我想访问像上面的"ServiceGateway“和"NowPlayingPresenter”这样的对象,并在测试中使用它们。模拟、侦察或空闲资源。在上面的例子中,我的空闲资源是在每个单独的测试中传递给espresso的"NowPlayingPresenter“具体实现。

EN

回答 2

Stack Overflow用户

发布于 2017-06-17 02:30:51

前几天,我设法解决了这个问题,使用了一个自定义的测试运行器( Test Runner )。第一件事是要有一个TestRunner for faking the Android Application。现在,您可以简单地扩展主应用程序类并覆盖onCreate(),注入一个返回模拟实例而不是真实实例的component built especially for testing

票数 0
EN

Stack Overflow用户

发布于 2017-07-21 19:06:08

我发现自己也遇到了类似的情况。这是我的问题Espresso testing with Dagger 2 and custom scopes。使用Espresso进行测试时,注入mock真的很棘手。

mcassiano建议的方法是解决这个问题的第一个想法。然而,我没有采用这种方法,因为必须创建代码开销。我很想看看mcassiano创建的Espresso测试是什么样子的。我假设您为您所覆盖的活动编写了一个ActivityTestRule,以便注入模拟。

在使用Dagger 2的理想情况下,我希望避免以下情况:

应用程序组件具有可感知所有其他应用程序的应用程序组件。应用程序组件提供对整个

的所有依赖项

我认为后者是一种代码气味,因为如果我们最终陷入上述任何一种情况,我们将拥有一个巨大的App组件和模块,它们与每个应用程序功能紧密耦合。

相反,应该让每个特性负责注入它自己的依赖项。

关于找到注入mock的解决方案,我有下面的想法,我没有实现,因为我不想把测试和生产代码混在一起。但是,如果你们能分享你们的想法,我将不胜感激。

  1. 引入了一个组件构建器,该组件构建器仅作为测试设置的一部分进行初始化,如果已初始化,则在活动代码中使用此设置,否则将设置实际组件。
  2. 在每个功能模块中检查构建类型,并在构建类型= espresso否则为实际对象

时提供模拟

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

https://stackoverflow.com/questions/43729039

复制
相关文章

相似问题

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