Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 匕首2:如何在JUnit测试中使用@Inject?_Java_Testing_Junit_Dependency Injection_Dagger 2 - Fatal编程技术网

Java 匕首2:如何在JUnit测试中使用@Inject?

Java 匕首2:如何在JUnit测试中使用@Inject?,java,testing,junit,dependency-injection,dagger-2,Java,Testing,Junit,Dependency Injection,Dagger 2,我希望能够使用Dagger2将依赖项注入JUnit测试(我是这个框架的新手)。从春天开始,你可以这样做: @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = MyApplication.class) public class MyTestClass { @Autowired private MyService service; @Test public void testMySer

我希望能够使用Dagger2将依赖项注入JUnit测试(我是这个框架的新手)。从春天开始,你可以这样做:

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

    @Autowired
    private MyService service;

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

}
。。。但是对于Dagger2,我还没有找到一个不依赖显式
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


任何关于如何实现这一点的提示都将不胜感激。

我还没有看到这方面的任何内置功能,或者任何支持这一功能的著名测试库

Dagger在编译时执行所有依赖项连接,并且只按照您告诉它的方式执行;与Spring不同,没有编写代码来在运行时读取测试类或提供它所需的依赖项。Dagger对Guice和Spring的吸引力来自编译时编译、验证和优化。虽然你所描述的会非常有用,但这种反映与Dagger最初的动机相反。要么您的Dagger组件使用生成的代码进行编译以注入测试,要么您需要能够独立地拉出这些依赖项,如上面所列


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

我担心这可能就是答案——匕首不会“朝这个方向滚”。编译时验证和运行时可读堆栈跟踪(没有神奇生成的字节码)的想法对我很有吸引力。然而,特别是在测试中,我不想手动注入每个依赖项,我真诚地认为这是测试运行者的工作。@Alan47这并不是说你不能编写一个测试助手来检查组件定义,检查测试的
@inject
成员,并调用正确的组件方法来或多或少自动填充测试字段。这将包含测试库内部和生产应用程序外部的反射。也就是说,您仍然需要在组件接口上提供每个用于测试绑定的组件;您无法访问组件并访问尚未通过接口提供的绑定。(事实上,Dagger可能根本不会为它生成代码!)这是真的。老实说,我考虑了一会儿。我还没决定是用匕首2还是Guice。