Я хотел бы выполнить модульный тест, где константа немного отличается, чем в стандартной версии. Таким образом, в моем модуле по умолчанию следующее
bindConstant().annotatedWith(Names.named("number of players")).to(4);
но в тестировании, я хотел бы попробовать эту строку вместо этого:
bindConstant().annotatedWith(Names.named("number of players")).to(2);
Я хотел бы достигнуть этого, не копируя всю остальную часть модуля. То, что я действительно хочу, является модулем "по умолчанию", который является "ниже" более специализированного модуля, такого, что в случае конфликта, специализированные победы модуля (вместо того, чтобы выдать исключение, которое является тем, что облик делает).
В сущности мой вопрос: как кто-либо устраивает больше чем один модуль без большого количества дублирования кода?
Обновление: я понял, что решение состоит в том, чтобы действительно использовать фабрику, а не константу в ЭТОМ варианте использования. Мне все еще было бы интересно учиться, существует ли что-то как иерархии модулей в целом, все же.
Обычно при правильном использовании 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
Как видите, существует довольно много способов упростить конфигурирование вашего приложения различными способами.