最近迁移到Dagger 2之后,我正在处理的应用程序正在为每个功能使用@ActivityScope。每个应用程序功能都是使用MVP模式实现的,并且拥有自己的本地匕首组件设置,这取决于应用程序组件在整个应用程序生命周期中所需的依赖关系(由应用程序提供)。每个功能的Activity都扩展了一个基类,该基类将主应用程序组件提供给每个活动重写的方法,以便设置本地dagger组件(构建本地组件并实例化本地模块)。
我想解决的问题是如何将mocks注入正在测试的Activity中。我遇到的主要问题是我无法在运行时将原始本地组件和相应的模块与模拟的模块交换。我读过很多关于使用Dagger 2进行Espresso测试的文章,但他们并没有推广干净的架构。在大多数情况下,他们依靠AppComponent来注入所有活动,在我的情况下,每个功能的组件都负责注入它自己的活动。
到目前为止,我提出的最佳方法是引入一个组件构建器,该构建器仅作为测试设置的一部分进行初始化,并在Activity代码中进行初始化时使用此设置,否则设置实际组件。但是,我不愿意混合生产和测试代码。 这是一个代表Dagger设置的示意图: Dagger 2 Setup
答案 0 :(得分:2)
我最后采用的方法是创建here所描述的自定义AndroidJUnitRunner
,并创建为每个应用功能提供模拟的组件/模块,包括应用模块{{3} }。此外,必须重写每个被测活动以注入模拟(只是注入模拟依赖项的方法)。
为了保持主应用程序清单的清洁,在调试清单中声明被覆盖的测试活动。 希望这种方法可以帮助类似check Google doc for best practices的人使用Espresso和Dagger 2进行测试。
滚滚一天!