Dagger2: Как использовать @Inject в тесте JUnit? - PullRequest
0 голосов
/ 04 октября 2018

Мне бы хотелось иметь возможность внедрять зависимости в тесты 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.

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

1 Ответ

0 голосов
/ 04 октября 2018

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

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

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

...