Как внедрить зависимости в тестовом примере Junit, используя Guice до запуска @Rule?

Фреймворки, с которыми я работаю, это Dropwizard 7, Guice и для тестирования у нас есть Junit с Jukito. У меня есть ресурс, написанный на dw, и мне нужно написать контрольный пример, соответствующий этому ресурсу. Примечание: мы недавно перешли с dw 6 на dw 7.

В dw 6 у нас были такие тесты:

@RunWith(JukitoRunner.class)
public class AbcResourceTest extends ResourceTest{
  @Inject
  private Provider<XyzAction> xyzProvider;
  public void setUpResources() throws Exception {
   addResource(new AbcResource(xyzProvider));
  }
  @Test
  public void doTesting() {
  }
}

Этот метод работал просто отлично, Guice вставлял всю зависимость, а ресурс инициализировался просто отлично.

Но в DW 7 синтаксис для написания теста ресурса изменился на следующий

public class ResourceTest {
 PersonDao personDao = mock(PersonDao.class);
 @Rule public ResourceTestRule resources = ResourceTestRule
      .builder()
      .addResource(new Resource(personDao))
      .build();
}

Это пример из документации по dw и отлично работает. Но если вместо насмешки PersonDao, если я попытаюсь ввести что-то вроде этого:

@RunWith(JukitoRunner.class)
public class AbcResourceTest {
  @Inject
  private Provider<XyzAction> xyzProvider;
 @Rule public ResourceTestRule resources = ResourceTestRule
      .builder()
      .addResource((new AbcResource(xyzProvider))
      .build();
  @Test
  public void doTesting() {
  }
}

Этот код создает экземпляр ресурса с нулевым значением для xyzProvider. Хотя Guice создает экземпляр xyzProvider, но только после оценки @Rule. Теперь моя проблема в том, что я хочу, чтобы Guice внедрил зависимость до оценки @Rule. Есть ли способ сделать это?

1 ответ

Решение

Я подозреваю что JukitoRunner приведет к тому, что инъекция произойдет до того, как @Rule работает. Но то, что он не может сделать, это вызвать внедрение до завершения конструктора. Нечто подобное может работать (синтаксис Java 8):

@Inject
private XyzAction xyz;

@Rule
public ResourceTestRule resources = ResourceTestRule
        .builder()
        .addResource(new AbcResource(() -> xyz))
        .build();
Другие вопросы по тегам