Как внедрить зависимости в тестовом примере 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();