Dagger2 - 注册替换模块而不重复代码

时间:2016-12-29 13:12:29

标签: java dagger-2

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

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

2 个答案:

答案 0 :(得分:2)

好吧,这就是显而易见的:我真的不确定这是标准的做法,但删除FooTestComponent并从FooTestModule删除注释允许{{ 1}}继承自FooTestModule,然后您可以实例化FooModule,只覆盖(但不注释)您需要模拟的FooTestModule方法。

答案 1 :(得分:2)

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

总结那里的建议:

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