AndroidInjector and Espresso



使用androidIndijector和子组件使得不可能将反对的活动注入浓缩咖啡的测试类中。

以前使用应用程序级别的组件和活动组件,只要您创建一个继承活动组件的测试组件,就可以使用该活动的测试类的功能调用注入((。

示例:

活动组件

@ActivityScope
@Component(
    dependencies = ApplicationComponent.class,
    modules = {
            NowPlayingActivityModule.class
    })
public interface NowPlayingActivityComponent {
    void inject(NowPlayingActivity activity);
}

测试类组件

@ActivityScope
@Component(
    dependencies = TestApplicationComponent.class,
    modules = {
            TestNowPlayingActivityModule.class,
            ActivityModule.class
    })
 public interface TestNowPlayingActivityComponent extends NowPlayingActivityComponent {
    void inject(NowPlayingActivityTest nowPlayingActivityTest);
}

测试模块

@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));
    }
}

在测试类中

TestNowPlayingActivityComponent mockNowPlayingActivityComponent = DaggerTestNowPlayingActivityComponent.builder()
            .testApplicationComponent((TestApplicationComponent) mvpExampleApplication.getComponent())
            .testNowPlayingActivityModule(new TestNowPlayingActivityModule(nowPlayingActivityModule))
            .build();
mockNowPlayingActivityComponent.inject((NowPlayingActivity) activity);
mockNowPlayingActivityComponent.inject(NowPlayingActivityTest.this);

人们如何访问自动生成的活动模块并将其用于Espresso UI测试?我想访问诸如" ServiceGateway"之类的对象&上面的" nowplayingPresenter"并在测试中使用它们。模拟,间谍或空闲资源。我在上面示例中的空闲资源是我在每个单独测试中将其传递给浓缩咖啡的" nowplayingpresenter"。

我在前几天设法使用自定义测试跑步者进行了一些骇人听闻的方法。首先是要有一个用于伪造Android应用程序的测试人员。现在,您可以简单地扩展主应用程序类并覆盖onCreate(),注入构建的组件,尤其是用于返回模拟实例而不是真实的组件。

我发现自己处于类似情况。这是我的问题用dagger2和自定义示波器进行的浓缩咖啡测试。在用浓缩咖啡进行测试时,注入模拟真的很棘手。

麦卡西亚诺建议的方法是解决这个问题的第一个想法。但是,由于必须创建的代码,我没有采用这种方法。我有兴趣了解McAssiano的浓缩咖啡测试的样子。我假设您为您覆盖的活动编写了一个ActivityTestrule,以注入模拟。

在使用dagger2的理想情况下,我想避免以下内容:

  • 有一个应用程序组件,该组件了解所有其他组件
  • 有一个应用程序组件提供了整个应用程序的所有依赖性

我将后者视为代码气味,因为如果我们在上述任何情况下最终都会有一个巨大的应用程序组件和模块,这些组件和模块与每个应用程序功能紧密结合。

应该发生的事情是让每个功能负责注入自己的依赖项。

在找到注入模拟的解决方案时,我有下面的想法,这些想法我没有实施,因为我不想将测试与生产代码混合。但是,如果你们分享您的想法。

  1. 介绍一个仅作为测试设置的一部分而初始化的组件构建器,并且在活动代码中使用此设置(如果初始化(,则可以使用真实的组件进行设置。
  2. 在每个功能中,模块检查构建类型,并提供模拟,如果构建类型=浓缩咖啡,其他对象

最新更新