使用AndroidInjector和子组件使得不可能将活动作用域对象注入到Espresso的测试类中。
以前,对于应用程序级组件和活动组件,只要您创建了一个继承了活动组件的测试组件,就可以对不是活动的测试类调用inject()。
示例:
活动组件
@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 Test中使用它们?我想访问像上面的"ServiceGateway“和"NowPlayingPresenter”这样的对象,并在测试中使用它们。模拟、侦察或空闲资源。在上面的例子中,我的空闲资源是在每个单独的测试中传递给espresso的"NowPlayingPresenter“具体实现。
发布于 2017-06-17 02:30:51
前几天,我设法解决了这个问题,使用了一个自定义的测试运行器( Test Runner )。第一件事是要有一个TestRunner for faking the Android Application。现在,您可以简单地扩展主应用程序类并覆盖onCreate(),注入一个返回模拟实例而不是真实实例的component built especially for testing。
发布于 2017-07-21 19:06:08
我发现自己也遇到了类似的情况。这是我的问题Espresso testing with Dagger 2 and custom scopes。使用Espresso进行测试时,注入mock真的很棘手。
mcassiano建议的方法是解决这个问题的第一个想法。然而,我没有采用这种方法,因为必须创建代码开销。我很想看看mcassiano创建的Espresso测试是什么样子的。我假设您为您所覆盖的活动编写了一个ActivityTestRule,以便注入模拟。
在使用Dagger 2的理想情况下,我希望避免以下情况:
应用程序组件具有可感知所有其他应用程序的应用程序组件。应用程序组件提供对整个
的所有依赖项
我认为后者是一种代码气味,因为如果我们最终陷入上述任何一种情况,我们将拥有一个巨大的App组件和模块,它们与每个应用程序功能紧密耦合。
相反,应该让每个特性负责注入它自己的依赖项。
关于找到注入mock的解决方案,我有下面的想法,我没有实现,因为我不想把测试和生产代码混在一起。但是,如果你们能分享你们的想法,我将不胜感激。
时提供模拟
https://stackoverflow.com/questions/43729039
复制相似问题