Dagger2: Как использовать @Inject в тесте JUnit?

Я хотел бы иметь возможность встраивать зависимости в тесты JUnit с помощью Dagger 2 (я новичок в этой структуре). Исходя из весны, вы можете сделать что-то вроде этого:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = MyApplication.class)
public class MyTestClass {

    @Autowired
    private MyService service;

    @Test
    public void testMySerivce() { /* ... */ }

}

... но с Dagger 2 я еще не нашел решение, которое не полагается на явный DaggerMyComponent.builder().build().myService() .

В идеале я бы предположил, что решение выглядит примерно так:

// tell JUnit that dagger needs to do some post processing
@RunWith(DaggerJUnit4Runner.class)
// tell dagger which component classes to use for injection
@Components(MyComponent.class)
public class MyTestClass {

    @Inject
    private MyService service;

    @Test
    public void testMySerivce() { /* ... */ }

}

К сожалению, нет DaggerJunit4Runner .

Будем очень благодарны за любые намеки на то, как это может быть достигнуто.

Всего 1 ответ


Я не видел встроенной функции для этого или какой-либо известной библиотеки тестирования, которая поддерживает это.

Кинжал выполняет всю свою проводку зависимостей во время компиляции и только способами, о которых вы говорите; в отличие от Spring, нет кода, написанного для чтения класса тестирования во время выполнения или предоставления необходимых ему зависимостей. Обращение кинжала к Guice и Spring происходит из компиляции, проверки и оптимизации компиляции. Хотя то, что вы описали, было бы очень полезно, такое отражение противоречит оригинальным мотивам кинжала. Либо ваш компонент Dagger скомпилирован с помощью сгенерированного кода для ввода теста, либо вам нужно будет вытащить эти зависимости независимо, как вы указали выше.

Для модульных тестов вам, вероятно, придется пропустить Кинжал и создать свои классы или их макеты вручную; для системных или интеграционных тестов вам нужно будет выявить все классы, которые вам нужны для определения компонента. Если вы хотите заменить зависимости тестовыми двойниками на повторяемость или изоляцию, вам нужно будет сделать свой компонент достаточно конфигурируемым, чтобы принять заменяющие реализации, или вам нужно будет создать новую для тестирования компонентную реализацию, которая вместо этого использует тестовые двойники реальных реализаций.


Есть идеи?

10000