Иерархия модулей в облике

Я хотел бы выполнить модульный тест, где константа немного отличается, чем в стандартной версии. Таким образом, в моем модуле по умолчанию следующее

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

но в тестировании, я хотел бы попробовать эту строку вместо этого:

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

Я хотел бы достигнуть этого, не копируя всю остальную часть модуля. То, что я действительно хочу, является модулем "по умолчанию", который является "ниже" более специализированного модуля, такого, что в случае конфликта, специализированные победы модуля (вместо того, чтобы выдать исключение, которое является тем, что облик делает).

В сущности мой вопрос: как кто-либо устраивает больше чем один модуль без большого количества дублирования кода?

Обновление: я понял, что решение состоит в том, чтобы действительно использовать фабрику, а не константу в ЭТОМ варианте использования. Мне все еще было бы интересно учиться, существует ли что-то как иерархии модулей в целом, все же.

8
задан nes1983 24 May 2010 в 21:37
поделиться

1 ответ

Обычно при правильном использовании Guice вам не нужно использовать Guice вообще в тестах (особенно в модульных тестах... интеграционные и сквозные тесты, да). В любом случае:

Я не уверен, что понимаю, что вы пытаетесь сделать или в чем именно проблема, но... вы понимаете, что при создании инжектора вы можете предоставить ему любое количество модулей, верно? Это ключевая часть использования 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

Как видите, существует довольно много способов упростить конфигурирование вашего приложения различными способами.

10
ответ дан 5 December 2019 в 17:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: