我希望能够使用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
。
任何有关如何实现此目标的提示将不胜感激。
答案 0 :(得分:1)
我还没有看到任何内置功能,也没有任何支持此功能的著名测试库。
Dagger在编译时并仅以您告知的方式进行所有依赖项连接;与Spring不同,这里没有编写任何代码来在运行时读取测试类或提供所需的依赖项。 Dagger对Guice和Spring的吸引力来自于编译时的编译,验证和优化。尽管您所描述的内容将非常有用,但这种反映与Dagger的原始动机相反。 要么使用生成的代码编译Dagger组件以注入测试,要么如上所述,您需要能够独立拉出那些依赖项。
对于单元测试,您可能需要跳过Dagger并手动创建类或它们的模拟。对于系统或集成测试,您需要在组件定义中公开所需的所有类。如果要用测试双精度替换依赖项以实现可重复性或隔离性,则需要使组件具有足够的可配置性,以接受替换实现,或者需要创建一个新的用于测试的组件实现,而要使用测试双精度来代替实际的实现方式。