Я начал использовать Guice, чтобы сделать некоторую инъекцию зависимостей в проекте, прежде всего потому, что мне нужно вводить издевательства (используя в настоящее время JMock) слой из теста unit, что делает ручную инъекцию очень неудобной.Каков наилучший способ использования Guice и JMock?
Мой вопрос - лучший способ введения макета? То, что я в настоящее время, чтобы сделать новый модуль в модульном тесте, который удовлетворяет зависимости и связать их с провайдером, который выглядит следующим образом:
public class JMockProvider<T> implements Provider<T> {
private T mock;
public JMockProvider(T mock) {
this.mock = mock;
}
public T get() {
return mock;
}
}
Передача издеваются в конструкторе, поэтому установка JMock может выглядеть это:
final CommunicationQueue queue = context.mock(CommunicationQueue.class);
final TransactionRollBack trans = context.mock(TransactionRollBack.class);
Injector injector = Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
bind(CommunicationQueue.class).toProvider(new JMockProvider<QuickBooksCommunicationQueue>(queue));
bind(TransactionRollBack.class).toProvider(new JMockProvider<TransactionRollBack>(trans));
}
});
context.checking(new Expectations() {{
oneOf(queue).retrieve(with(any(int.class)));
will(returnValue(null));
never(trans);
}});
injector.getInstance(RunResponse.class).processResponseImpl(-1);
Есть ли лучший способ? Я знаю, что AtUnit пытается решить эту проблему, хотя мне не хватает того, как она автоматически вводит макет, созданный локально, как указано выше, но я ищу либо убедительную причину, почему AtUnit - правильный ответ здесь (другой чем его способность изменять DI и насмешливые рамки без изменения тестов), или если есть лучшее решение для этого вручную.
В конкретном примере вы совершенно правы, что DI не нужен для издевательств (если я сделал закрытый пакет конструктора, я думаю), но отсюда у меня есть зависимости, которые нужно ввести в два шага от тестового кода (RunResponse получает имя класса из очереди и создает его экземпляр), поэтому я смотрел на Guice, чтобы сделать полевую инъекцию для этой цели. – Yishai
Я вижу. Ничто не мешает вам использовать Guice в тестах, но, если это возможно, я предлагаю попробовать и избежать этого (если вы не тестируете уровень функциональности/интеграции) Проблема в том, что вы нарушаете Закон Деметры , Ваш текущий класс должен только беспокоиться о его непосредственных зависимостях, и переходные зависимости не должны приниматься во внимание. В модульных тестах для текущих зависимостей классов вы делаете то же самое и учитываете только непосредственные зависимости.Такая схема делает ваш код более чистым и более дружественным к DI :) – gpampara