162 votes

La substitution de liaison dans Guice

J'ai juste commencé à jouer avec Guice, et un cas d'utilisation, je pense que dans un test, je veux juste remplacer une liaison unique. Je pense que j'aimerais utiliser le reste de la production au niveau des liaisons pour s'assurer que tout est configuré correctement et d'éviter les doublons.

Imaginez donc j'ai le Module suivant

public class ProductionModule implements Module {
    public void configure(Binder binder) {
        binder.bind(InterfaceA.class).to(ConcreteA.class);
        binder.bind(InterfaceB.class).to(ConcreteB.class);
        binder.bind(InterfaceC.class).to(ConcreteC.class);
    }
}

Et dans mon test, j'ai seulement envie de remplacer InterfaceC, tout en gardant InterfaceA et InterfaceB dans le tact, donc je voudrais quelque chose comme:

Module testModule = new Module() {
    public void configure(Binder binder) {
        binder.bind(InterfaceC.class).to(MockC.class);
    }
};
Guice.createInjector(new ProductionModule(), testModule);

J'ai aussi essayé le suivant, avec pas de chance:

Module testModule = new ProductionModule() {
    public void configure(Binder binder) {
        super.configure(binder);
        binder.bind(InterfaceC.class).to(MockC.class);
    }
};
Guice.createInjector(testModule);

Personne ne sait si il est possible de faire ce que je veux ou je suis complètement aboiements le mauvais arbre??

--- Suivi de: Il semblerait que je puisse réaliser ce que je veux si je peux utiliser le @ImplementedBy tag sur l'interface, puis il suffit de fournir une liaison dans le cas du test, qui fonctionne très bien quand il y a un mappage 1-1 entre l'interface et la mise en œuvre.

Aussi, après discussion avec un collègue, il semblerait qu'on avait la tête en bas de la route de l'annulation de l'ensemble du module et de nous assurer que nous disposons de nos modules définis correctement. Cela semble comme il pourrait causer un problème si une liaison est égaré dans un module et doit être déplacé, ainsi briser éventuellement une charge de tests que les liaisons peuvent ne plus être disponibles pour être surchargée.

174voto

albertb Points 1662

Cela pourrait ne pas être la réponse que vous cherchez, mais si vous êtes à l'écriture de tests unitaires, vous ne devriez probablement pas être l'aide d'un injecteur et plutôt injection de maquette ou de faux objets à la main.

D'autre part, si vous voulez vraiment remplacer une liaison unique, vous pouvez utiliser Modules.override(..):

public class ProductionModule implements Module {
    public void configure(Binder binder) {
        binder.bind(InterfaceA.class).to(ConcreteA.class);
        binder.bind(InterfaceB.class).to(ConcreteB.class);
        binder.bind(InterfaceC.class).to(ConcreteC.class);
    }
}
public class TestModule implements Module {
    public void configure(Binder binder) {
        binder.bind(InterfaceC.class).to(MockC.class);
    }
}
Guice.createInjector(Modules.override(new ProductionModule()).with(new TestModule()));

Voir les détails ici.

Mais comme la javadoc pour Modules.overrides(..) recommande, vous devez concevoir vos modules dans une telle manière que vous n'avez pas besoin de remplacer les liaisons. Dans l'exemple que vous avez donné, vous pourriez réaliser que par le déplacement de la liaison de l' InterfaceC pour un module séparé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X