2010-05-24 4 views
8

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

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

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

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

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

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

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

ответ

10

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

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

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

+0

Переопределить! Именно этого я и хотел! Спасибо! – nes1983

Смежные вопросы