2010-05-24 3 views
8

Je souhaite effectuer un test unitaire où la constante est légèrement différente de la version standard. C'est, dans mon module par défaut, ce qui suit estHiérarchie des modules en guice

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

mais dans les tests, je voudrais essayer cette ligne à la place:

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

Id comme pour y parvenir sans copier tout le reste du module. Ce que je veux vraiment, c'est un module "par défaut" qui soit "en dessous" d'un module plus spécialisé, de sorte qu'en cas de conflit, le module spécialisé gagne (au lieu de lancer une exception, ce que fait le guice).

Pour l'essentiel, ma question est la suivante: comment quelqu'un peut-il organiser plus d'un module sans beaucoup de duplication de code?

Mise à jour: J'ai réalisé que la solution est vraiment d'utiliser une usine, plutôt qu'une constante dans ce cas d'utilisation. J'aimerais quand même savoir s'il y a quelque chose comme des hiérarchies de modules en général.

Répondre

10

Généralement, lorsque vous utilisez correctement Guice, vous ne devriez pas du tout utiliser Guice dans les tests (en particulier les tests unitaires ... l'intégration et les tests de bout en bout, oui). Anyway:

Je ne suis pas sûr de comprendre ce que vous essayez de faire ou quel est exactement le problème, mais ... vous vous rendez compte que lorsque vous créez un Injector, vous pouvez lui fournir un nombre de Module, non? C'est un élément clé de l'utilisation de Guice. Faites les modules comme cours ou à grains fins comme vous voulez. Vous pourriez avoir un NumberOfPlayersModule qui a seulement une liaison, et ensuite utiliser un module différent avec une liaison différente à la place parfois (comme pour votre test). Vous pouvez également créer un module qui prend un argument constructeur et créer le module en tant que new NumberOfPlayersModule(4) ou new NumberOfPlayersModule(2) comme vous le souhaitez.

Il existe également une autre fonctionnalité de Guice qui vous permet de remplacer les liaisons dans un ou plusieurs modules avec des liaisons d'un ou plusieurs autres modules. Cela fonctionne comme ceci:

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

Comme vous pouvez le voir, il y a vraiment beaucoup de façons de faire de configurer votre application de différentes manières faciles.

+0

Remplacer! C'est exactement ce que je voulais! Je vous remercie! – nes1983