Java 测试具有依赖关系的spring引导控制器?(朱尼特)

Java 测试具有依赖关系的spring引导控制器?(朱尼特),java,spring-boot,junit,Java,Spring Boot,Junit,我有一门考试课: @RunWith(SpringRunner.class) @WebMvcTest(ClassToBeTested.class) public class ClassToBeTestedTests { @Autowired private MockMvc mockMvc; @Test public void simpleTestMethodToGetClassWorking(){ Assert.assertTrue(true);

我有一门考试课:

@RunWith(SpringRunner.class)
@WebMvcTest(ClassToBeTested.class)
public class ClassToBeTestedTests {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void simpleTestMethodToGetClassWorking(){
        Assert.assertTrue(true);
    }
}
但在我想测试的课堂上,我有一句话:

@Autowired
AnnoyingServiceWhichIsADependency annoyingDependency;
因此,当我尝试运行测试类时,会出现以下错误:

java.lang.IllegalStateException: Failed to load ApplicationContext
这句话的原因似乎是:

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'ClassToBeTested': Unsatisfied dependency expressed through field 'AnnoyingServiceWhichIsADependency'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type '<package-path>.AnnoyingServiceWhichIsADependency' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
原因:org.springframework.beans.factory.unsatifiedDependencyException:创建名为“ClassToBeTested”的bean时出错:通过字段“烦扰服务whichisadependency”表示未满足的依赖关系;嵌套异常为org.springframework.beans.factory.NoSuchBean定义异常:没有类型为“.HappingServicewhichichisadependency”的合格bean可用:至少需要1个符合autowire候选条件的bean。依赖项注释:{@org.springframework.beans.factory.annotation.Autowired(required=true)}
我要补充的是,实际的类确实可以工作,并且做它应该做的事情,但是在单元测试世界中,我很难让它工作


感谢所有帮助。

没有为依赖类创建bean的原因是您使用的是
@WebMvcTest
,而不是
@springbootest
:只扫描控制器和MVC基础结构类。从:

当测试只关注SpringMVC组件时可以使用

因为这是一个MVC测试,所以可以模拟服务依赖性。
示例:

未为依赖类创建bean的原因是您使用的是
@WebMvcTest
,而不是
@springbootest
:只扫描控制器和MVC基础结构类。从:

当测试只关注SpringMVC组件时可以使用

因为这是一个MVC测试,所以可以模拟服务依赖性。
示例:

您的测试应用程序上下文正在尝试加载要测试的类,但无法找到其依赖项之一,并通过该错误对此进行投诉。基本上,您需要在测试上下文中具有该类型的@Bean。一个选项是创建一个TestConfig类,该类通过@Bean注释提供该依赖项的模拟/间谍。在测试中,您必须通过刚刚创建的@ContextConfiguration注释在上下文中加载此测试配置


您的测试应用程序上下文正在尝试加载要测试的类,但无法找到其依赖项之一,并通过该错误对此进行投诉。基本上,您需要在测试上下文中具有该类型的@Bean。一个选项是创建一个TestConfig类,该类通过@Bean注释提供该依赖项的模拟/间谍。在测试中,您必须通过刚刚创建的@ContextConfiguration注释在上下文中加载此测试配置


@WebMvcTest只扫描web层-MVC基础结构和@Controller类。就这样。因此,如果您的控制器对来自(例如)服务层的其他bean具有某种依赖性,则不会发现它们被注入

如果您想要更全面的集成测试,请使用@SpringBootTest而不是@WebMvcTest

如果您想要更接近单元测试的东西,请模拟您的依赖关系


还请注意,正是由于这些原因,不建议现场注入(@Autowired直接在现场)。我建议您更改为incheciton中的构造函数(为Classtobetested添加一个构造函数,并在其上放置@Autowired注释),然后对于单元测试,您可以通过模拟。构造函数注入带来了更易于测试和配置的设计

@WebMvcTest只扫描web层-MVC基础结构和@Controller类。就这样。因此,如果您的控制器对来自(例如)服务层的其他bean具有某种依赖性,则不会发现它们被注入

如果您想要更全面的集成测试,请使用@SpringBootTest而不是@WebMvcTest

如果您想要更接近单元测试的东西,请模拟您的依赖关系


还请注意,正是由于这些原因,不建议现场注入(@Autowired直接在现场)。我建议您更改为incheciton中的构造函数(为Classtobetested添加一个构造函数,并在其上放置@Autowired注释),然后对于单元测试,您可以通过模拟。构造函数注入带来了更易于测试和配置的设计

只要模仿这种依赖性就行了。假设
烦扰服务的依赖性
是一个接口:

@RunWith(SpringRunner.class)
@WebMvcTest(ClassToBeTested.class)
public class ClassToBeTestedTests {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private AnnoyingServiceWhichIsADependency annoyingDependency;

    @Test
    public void simpleTestMethodToGetClassWorking(){
        Assert.assertTrue(true);
    }
}

时使用Mockito
,然后返回
方法来指示模拟。

只需模拟该依赖项即可。假设
烦扰服务的依赖性
是一个接口:

@RunWith(SpringRunner.class)
@WebMvcTest(ClassToBeTested.class)
public class ClassToBeTestedTests {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private AnnoyingServiceWhichIsADependency annoyingDependency;

    @Test
    public void simpleTestMethodToGetClassWorking(){
        Assert.assertTrue(true);
    }
}

时使用Mockito
,然后返回
方法来指示模拟。

是否要运行MVC测试或完整集成测试?是否要运行MVC测试或完整集成测试?