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

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

@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 отсутствует.

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
0
1 166
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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

Alan47 04.10.2018 00:43

@ Alan47 Это не значит, что вы не можете написать помощника по тестированию, который проверяет определение компонента, проверяет элементы теста @Inject и вызывает правильные методы компонента для более или менее автоматического заполнения тестовых полей. Это будет содержать отражение внутри библиотеки тестирования и вне вашего производственного приложения. Тем не менее, вам все равно нужно будет сделать каждую привязку для тестирования доступной в интерфейсе компонента; вы не могли войти в Компонент и получить доступ к привязке, которую вы не сделали доступной через интерфейс. (На самом деле, Dagger может вообще не генерировать для него код!)

Jeff Bowman 04.10.2018 00:55

Правда что. Честно говоря, я обдумывал это на мгновение. Я все еще не решил, хочу ли я использовать Dagger 2 или Guice.

Alan47 04.10.2018 01:00

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