提问者:小点点

雄激素注射器和浓缩咖啡


使用AndroidInjector和子组件使得无法将objected的activity作用域注入到Espresso的测试类中。

以前,在使用应用程序级组件和activity组件时,只要创建继承了activity组件的测试组件,就可以调用inject()来测试不是活动的类。

示例:

activity成分

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

人们如何获得activity模块的访问,是自动生成的,并使用他们在espresso UI测试?我想要访问像上面的“ServiceGateway”和“NowPlayingPresenter”这样的对象,并在测试中利用它们。模拟、间谍或闲置资源。上面示例中的空闲资源是“NowPlayingPresenter”的具体实现,我在每个单独的测试期间传递给espresso。


共1个答案

匿名用户

前几天我用一个自定义的测试运行器,用一个简单的方法解决了这个问题。第一件事是有一个测试者来伪造Android应用程序。现在,您可以简单地扩展主app类并重写oncreate(),注入一个专门为测试构建的组件,该组件返回模拟实例而不是真实实例。