Dagger2:如何在JUnit测试中使用@Inject?

时间:2018-10-03 21:43:31

标签: testing junit dependency-injection dagger-2

我希望能够使用Dagger 2将依赖项注入JUnit测试中(我是这个框架的新手)。来自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 :(得分:1)

我还没有看到任何内置功能,也没有任何支持此功能的著名测试库。

Dagger在编译时并仅以您告知的方式进行所有依赖项连接;与Spring不同,这里没有编写任何代码来在运行时读取测试类或提供所需的依赖项。 Dagger对Guice和Spring的吸引力来自于编译时的编译,验证和优化。尽管您所描述的内容将非常有用,但这种反映与Dagger的原始动机相反。 要么使用生成的代码编译Dagger组件以注入测试,要么如上所述,您需要能够独立拉出那些依赖项。

对于单元测试,您可能需要跳过Dagger并手动创建类或它们的模拟。对于系统或集成测试,您需要在组件定义中公开所需的所有类。如果要用测试双精度替换依赖项以实现可重复性或隔离性,则需要使组件具有足够的可配置性,以接受替换实现,或者需要创建一个新的用于测试的组件实现,而要使用测试双精度来代替实际的实现方式。