2016-12-29 50 views
2

我有這種組件加模塊的設置,例如FooComponent和FooModule,它提供了一個簡單的單例,它需要在其中一個測試變體中替換。因此,在該變體中,我改爲FooTestComponent,它繼承FooComponent,但它的@Modules註釋指向另一個模塊,而不是FooTestModule。到目前爲止FooModule只提供一個依賴項,所以沒有問題。Dagger2 - 注入替換模塊而不復制代碼

然而,由於需要不依賴於測試來代替被添加到FooModule,我看到自己被迫複製所有的方法,爲他們提供在FooTestModule太多,因爲它們不能被提取到一個抽象父模塊FooModuleFooTestModule繼承自。有什麼辦法避免這種重複?

回答

2

Dagger 2 User's Guide Testing Section包含針對這種情況的建議。

總結有意見:

  1. 子類模塊,以便在測試雙打交換導致了,你必須解決的依賴關係所有即使它們是未使用的情況。不要這樣做!
  2. 而是在1點的辦法,使用不同的組件配置來實現這一點:你可以有擴展ProductionComponent並使用不同的模塊,包括測試綁定雙打
  3. 爲了實現點2,組織你的模塊可測試性TestComponent 。這意味着將模塊視爲已發佈和內部綁定的集合,並確保您爲每個已發佈的具有「合理替代方案」的綁定分別設置了一個模塊,也就是說,您可能希望用不僅僅是內部的測試雙代替依賴。
2

好了好了,所以這是怎麼一回事呢顯然是:我真的不能確定這是做,但刪除FooTestComponentFooTestModule刪除註釋的標準方式允許FooTestModuleFooModule繼承,然後您可以實例FooTestModule您可以覆蓋(但不註釋)只需要模擬的@Provides方法。

+1

如果這是一個Android項目,我會建議讓單獨的組件與一些代碼重複,以獲得更大的靈活性。 – benji

+0

請參閱http://stackoverflow.com/a/41414824/2065363 –