2010-05-24 14 views
8

Me gustaría ejecutar una prueba de unidad donde una constante es ligeramente diferente que en la versión estándar. Esto es, en mi módulo por defecto, el siguiente esJerarquía de módulos en guice

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

pero en las pruebas, me gustaría probar esta línea en su lugar:

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

Id como para lograr que sin copiar todo el resto del módulo Lo que realmente quiero es un módulo "predeterminado" que esté "debajo" de un módulo más especializado, de modo que en caso de conflicto, el módulo especializado gane (en lugar de lanzar una excepción, que es lo que hace Guice).

En esencia, mi pregunta es: ¿cómo alguien puede organizar más de un módulo sin mucha duplicación de código?

Actualización: Me he dado cuenta de que la solución es realmente utilizar una fábrica, en lugar de una constante en ESTE caso de uso. Sin embargo, todavía estaría interesado en saber si hay algo así como jerarquías de módulos en general.

Respuesta

10

Por lo general, al usar Guice correctamente, no debería necesitar usar Guice en absoluto en las pruebas (particularmente pruebas unitarias ... integración y pruebas de extremo a extremo, sí). De todos modos:

No estoy seguro de entender lo que estás tratando de hacer o cuál es el problema exactamente pero ... te das cuenta de que al crear un Injector puedes proporcionar cualquier número de Module s, ¿verdad? Esa es una parte clave del uso de Guice. Haga los módulos como curso o de grano fino como desee. Podría tener un NumberOfPlayersModule que solo tiene ese enlace, y luego usar un módulo diferente con un enlace diferente en su lugar algunas veces (como para su prueba). También puede crear un módulo que tome un argumento de constructor y crear el módulo como new NumberOfPlayersModule(4) o new NumberOfPlayersModule(2) como desee.

También hay otra característica de Guice que le permite anular enlaces en uno o más módulos con enlaces de uno o más módulos. Eso funciona así:

// 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 

Como se puede ver, hay realmente un montón de maneras de hacer que la configuración de la aplicación de diferentes maneras fácil.

+0

¡Anular! ¡Eso es precisamente lo que quería! ¡Gracias! – nes1983