2010-05-24 65 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