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