3

在最近迁移到 Dagger 2 之后,我正在开发的应用程序对每个功能都使用了 @ActivityScope。每个应用程序功能都使用 MVP 模式实现,并具有自己的本地 dagger 组件设置,该设置依赖于应用程序组件,以获取在整个应用程序生命周期中所需的依赖项(由应用程序提供)。每个功能的 Activity 都扩展了一个基类,该基类将主应用程序组件提供给一个方法,该方法被每个 Activity 覆盖,以设置本地 dagger 组件(构建本地组件并实例化本地模块)。

我要解决的问题是如何将模拟注入到被测活动中。我遇到的主要问题是我无法在运行时将原始本地组件和相应的模块与模拟的模块交换。我读过很多关于使用 Dagger 2 进行 Espresso 测试的文章,但它们并没有促进清洁架构。在大多数情况下,他们依赖 AppComponent 来注入所有活动,在我的例子中,每个功能的组件都负责注入自己的活动。

到目前为止,我想出的最好的方法是引入一个组件构建器,它仅作为测试设置的一部分进行初始化,如果初始化,则在 Activity 代码中使用此设置,否则设置真正的组件。但是,我不愿意混合生产和测试代码。这是代表 Dagger 设置的示意图: Dagger 2 Setup

4

1 回答 1

3

我最后采用的方法是按照此处AndroidJUnitRunner所述创建自定义,并创建为每个应用程序功能提供模拟的组件/模块,包括应用程序模块检查 Google 文档以获取最佳实践。此外,必须覆盖每个被测活动以注入模拟(只是注入模拟依赖项的方法)。

为了保持主应用程序清单干净,在调试清单中声明了覆盖的测试活动。希望这种方法可以帮助与我的 Dagger 2 设置类似的人使用 Espresso 和 Dagger 2 进行测试。

有一个摇滚的一天!

于 2017-08-07T11:06:49.553 回答