Dagger2 - 在不复制代码的情况下注入替换模块

Dagger2 - Injection of replacement modules without duplicating code

我有这个组件加模块的设置,比如 FooComponent 和 FooModule,它提供了一个简单的单例,需要在其中一个测试变体中替换它。因此,在变体中我改为 FooTestComponent,它继承了 FooComponent,但它的 @Modules 注释指向另一个模块 FooTestModule。到目前为止 FooModule 只提供了一个依赖项,所以没有问题。

然而,由于在测试中不需要替换的依赖项被添加到 FooModule,我发现自己被迫复制所有方法以在 FooTestModule 中提供它们,因为它们不能' t 被提取到 FooModuleFooTestModule 继承自的父抽象模块。有什么方法可以避免这种重复?

好吧,事情显然是这样的:我真的不确定这是标准的做法,但是删除 FooTestComponent 并从 FooTestModule 中删除注释允许 FooTestModule 继承自 FooModule,然后您可以实例化 FooTestModule,您只需要覆盖(但不注释)您需要模拟的 @Provides 方法。

Dagger 2 User's Guide Testing Section 包含针对这种情况的建议。

总结那里的建议:

  1. 为了交换测试替身而对模块进行子类化会导致您必须解决 所有 依赖项的情况,即使它们未被使用。不要这样做!
  2. 代替第 1 点中的方法,使用不同的组件配置来实现此目的:您可以拥有一个扩展 ProductionComponent 的 TestComponent 并使用包含测试替身绑定的不同模块
  3. 要实现第 2 点,请组织您的模块以实现可测试性。这意味着将模块视为已发布和内部绑定的集合,并确保每个已发布的绑定都有一个单独的模块,该模块具有 'reasonable alternative' 即,您可能希望用不仅仅是测试替身替换的替代方案内部依赖。