2014-03-25 77 views
0

假設我有Z類中注入A類:提供了在吉斯構建對象爲場中的目標

class Z { 
    @Inject 
    public Z(.., A arg, ..) { 
    .. 
    } 
} 

假設類A有這樣的構造:

@Inject 
public A(B arg0, C arg1, D arg2) { 
... 
} 

我想注入正常工作,除了特殊情況下,我想提供其中一個參數。例如使用C類的cObject構造A。注意A本身是用Z構造的。

我想要這個,因爲我正在爲Z寫一個功能測試,我想根據測試提供不同種類的假貨。一個測試文件將只包含一種假的爲B,或C或D.

+0

可能是一個建設者模式可以幫助嗎? – Keerthivasan

+0

@Octopus,你能解釋一下嗎?謝謝。 – user3458168

+0

'Builder'模式可以幫助您根據需求傳遞任意數量的參數。您只能傳遞所需的參數。請檢查構建器模式是否符合您的要求 – Keerthivasan

回答

2

我會建議使用Modules.override這裏,其中有關於它的功能測試使用的文檔。請謹慎使用,因爲事情可能會變得非常混亂和難以遵循,否則,但它應該是這樣的:

@Before 
public void createInjector() { 
    this.injector = Guice.createInjector(
     Modules.override(new YourZABCDModule()).with(new AbstractModule() { 
     @Override public void configure() { 
      bind(B.class).to(FakeB.class); 
     } 
     })); 
} 

或者,正如Modules.override文檔,只需使用更小的模塊進行更精細的組合:

@Before 
public void createInjector() { 
    this.injector = Guice.createInjector(
     new ZAModule(), 
     new FakeBModule(), 
     new CModule(), 
     new DModule()); 
} 
+0

在我的情況下,我會壓倒嘲笑。我想我應該在這種情況下更喜歡Modules.override,是嗎? – user3458168

+0

這完全取決於你的模塊的粒度,以及你是否試圖替換完整模塊的綁定或者只是一個大模塊中的一個。對於模塊佈局和粒度沒有單一的最佳實踐,所以選擇一個最適合您模塊結構的模塊。祝你好運! –