Junit для внедрения google guice

У меня есть класс Dummy.java, конструктор которого аннотирован @Inject.

@Inject
public Dummy() {
  this.injector = TestDummy.getInjector();
  init();
}

В init () я ввожу различные зависимости, например:

private void init() {
  this.tester = injector.getInstance(tester.class);
  this.jack = injector.getInstance(jack.class);   
}

Теперь, когда я пишу junit для Dummy.java, я не понимаю, как внедрить эти зависимости? Любые лиды будут оценены.

0
0
209
1

Ответы 1

Проблема здесь в том, что вы откровенно говорите о своем инжекторе. В идеале вы должны получать свои зависимости (Tester и Jack) через конструктор без необходимости устанавливать Injector.

@Inject
public Dummy(Tester tester, Jack jack) {
  this.tester = tester;
  this.jack = jack;
}

Теперь в ваших тестах вы можете вызвать этот конструктор public вручную и передать любой экземпляр Tester или Jack, который вы хотите, включая (но не требуя) тестовый дублер или макет.

Dummy dummy = new Dummy(new UnitTestTester(), mockJack);

Поскольку вы аннотировали экземпляр с помощью @Inject, вам не нужно беспокоиться о Injector: пока вы получаете копию Dummy от Injector, он будет читать этот конструктор и передавать экземпляры Tester и Jack.

public class YourDummyConsumer {
  @Inject public YourDummyConsumer(Dummy dummy) { /* ... */ }
}

getInstance по-прежнему полезен, но обычно вы увидите его только на самом верхнем уровне, в своем классе Application или в вашем методе public static void main(String[] args):

Dummy dummy = injector.getInstance(dummy);

Всего у меня 15 параметров, поэтому я не могу взять их в конструкторе (вопреки стандартам кодирования). Вот почему пришлось сделать это так.

IllegalSkillsException 11.09.2018 07:21

@IllegalSkillsException Если у вас есть 15 параметров, это явный признак того, что ваш класс делает слишком много и его следует реорганизовать в два или три меньших, более сфокусированных класса. (Кроме того, у меня есть настойчивое подозрение, что стандарты кодирования существуют именно для того, чтобы препятствовать таким случаям, как ваш, и что работа вокруг правила, вероятно, вызовет еще больше проблем в будущем.)

Jeff Bowman 11.09.2018 09:22

Другие вопросы по теме