2010-05-24 66 views
8

我想運行一個常量與標準版本稍有不同的單元測試。也就是說,在我的默認模塊,下面是guice中的模塊層次

bindConstant().annotatedWith(Names.named("number of players")).to(4); 

,但在測試中,我想試試這行:

bindConstant().annotatedWith(Names.named("number of players")).to(2); 

我還想實現,沒有複製所有的休息的模塊。我真正想要的是一個「默認」模塊,它位於一個更專用的模塊的「下方」,以便在發生衝突時專用模塊獲勝(而不是拋出異常,這是guice的作用)。

從本質上講,我的問題是:任何人如何安排多個模塊而沒有大量的代碼重複?

更新:我已經意識到解決方案是真正使用工廠,而不是在本用例的常量。儘管如此,我仍然有興趣瞭解是否有類似層級的模塊。

回答

10

通常,當正確使用Guice時,你不應該在測試中使用Guice(特別是單元測試...集成和端到端測試,是的)。無論如何:

我不知道我明白你想要做什麼或者問題是什麼,但是......你意識到在創建Injector時,你可以提供任意數量的Module,對嗎?這是使用Guice的關鍵部分。根據需要將模塊製作爲過程或細粒度。你可能有一個NumberOfPlayersModule只有一個綁定,然後有時使用不同的模塊和不同的綁定(比如你的測試)。您也可以創建一個模塊,該模塊需要構造函數參數,並根據需要創建模塊new NumberOfPlayersModule(4)new NumberOfPlayersModule(2)

Guice還有另一個功能,可以讓您使用一個或多個其他模塊的綁定覆蓋一個或多個模塊中的綁定。這是這樣工作的:

// FooModule is your module that contains the "number of players" binding and 
// some others 

Module override = Modules.override(new FooModule()) 
    .with(new AbstractModule() { 
     protected void configure() { 
     bindConstant().annotatedWith(Names.named("number of players")).to(2); 
     } 
    }); 
Injector injector = Guice.createInjector(override); 
// The int @Named("number of players") for the injector is 2 

正如您所看到的,確實有很多方法可以使您的應用程序以不同的方式輕鬆配置。

+0

覆蓋!這正是我想要的!謝謝! – nes1983 2010-05-25 07:36:29