Android 使用Dagger2注入模拟演示者

Android 使用Dagger2注入模拟演示者,android,dagger-2,android-instrumentation,Android,Dagger 2,Android Instrumentation,我的目标是编写插装测试,其中被测试的类是一个注入了模拟演示者的活动。我还希望演讲者的生活与举办活动的人一样。最后,在活动中注入的模拟演示者也应该能够从测试类中引用,以便可以设置、验证模拟等。。。作为测试的一部分 项目设置: 我使用gradle flavors将项目分解为可用于我尝试编写的不同类型测试的源代码集。我有一个mockRepo风格,其中我有Dagger组件和模块,它们创建了我所有依赖项的“真实”实例,我模拟的存储库除外。我有一个endToEnd风格,在这里我注入每个依赖项的真实实例。我尝

我的目标是编写插装测试,其中被测试的类是一个注入了模拟演示者的活动。我还希望演讲者的生活与举办活动的人一样。最后,在活动中注入的模拟演示者也应该能够从测试类中引用,以便可以设置、验证模拟等。。。作为测试的一部分

项目设置:

我使用gradle flavors将项目分解为可用于我尝试编写的不同类型测试的源代码集。我有一个mockRepo风格,其中我有Dagger组件和模块,它们创建了我所有依赖项的“真实”实例,我模拟的存储库除外。我有一个endToEnd风格,在这里我注入每个依赖项的真实实例。我尝试添加的最后一种风格是mockPresenter风格,它创建演示者的模拟实例,以便我能够真正隔离视图,并确保在活动的生命周期方法运行时,在演示者上调用正确的方法

mockRepo和endToEnd风格的编写非常简单,因为在这两种情况下,我都能够扩展应用程序类进行测试,并且能够交换应用程序类中的不同dagger组件,这使得注入模拟存储库非常容易

mockPresenter的风格给我带来了问题。问题是,如果不添加类似的方法,我无法将模拟演示者注入MainActivity

DaggerMainComponent getMainComponent() {
    return mDaggerMainComponent
}
去我的申请班。我不希望这样做,因为应用程序类似乎根本不需要了解不完整性,这只是一种变通方法

以下是MainActivity的注入代码当前的外观:

@Inject
MainContract.Presenter mMainPresenter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mMainComponent = DaggerMainComponent
            .builder()
            .appInjector(((MyApplication) getApplicationContext()).getAppComponent())
            .mainModule(new MainModule())
            .mainPresenterModule(new MainPresenterModule())
            .build();
    mMainComponent.inject(this);

    mMainPresenter.setView(this);
}
我喜欢这样做的原因是,在onCreate中,我使用Dagger生成的名为DaggerComponent的类来创建component的实例,该实例保证我将获得一个新组件,该组件保证每次运行onCreate时都会获得一个新的演示者。此外,我还可以在onCreate中获取对组件的引用,并在onDestroy()中取消对它的引用。但是,似乎也不可能注入模拟MainPresenter,因为我唯一可以这样做的机会是:

.mainPresenterModule(new MainPresenterModule())
MainPresenterModule只创建presenter的“真实”实例,如果我是这样做的话,请使用以下内容:

.mainPresenterModule(new MockPresenterModule())
那么就没有办法将演示者的“真实”版本用于应用程序的生产版本

在这种情况下,我看到的解决方法似乎都涉及到在应用程序类上有一个返回组件或模块的方法。在应用程序的生产版本中,应用程序类将返回依赖于提供真实实例的模块的组件,或者甚至可以只提供模块本身。应用程序的测试版本将有一个测试应用程序,该应用程序将扩展生产应用程序类并覆盖某些方法,因此当测试应用程序运行时,它将返回组件的模拟版本,该组件将声明将提供模拟的模块,或者它将直接返回模拟模块

我看到的另一种解决方法是在应用程序类中使用@ExposedForTesting注释,这似乎是我想要避免的

让应用程序类公开getter方法以便可以注入模拟/真实依赖项对我来说似乎是一种代码味道,因为我看不到应用程序类应该知道应该注入MainActivity的依赖项的真正原因。此外,似乎每个活动或片段都会有一个getter方法,这将开始膨胀应用程序类


有没有一种方法可以将mock注入到活动中,这样应用程序类就不会在提供正确的模块或组件方面扮演如此重要的角色?

我的观点是:我不知道不同的应用程序有多糟糕。。。这只是一些getters…@LeandroBorgesFerreira不得不这么做似乎是件奇怪的事情,所以我怀疑Dagger2中是否遗漏了一些更大的概念,这些概念允许我做我想做的事情,而无需依赖应用程序类来帮助将模块/组件路由到正确的活动/片段。这!!!我一直希望现在有人能解决这个问题!。请..老师,告诉我你找到了一个解决办法。@yUdoDis我从来没有想到这一点。@neonDion T\T感谢你和我一起受苦,那么这是不可能的还是不支持你的想法?