【问题标题】:Junit cannot detect an @Autowired Bean during a test of a configuration class in JavaJunit 在 Java 中的配置类测试期间无法检测到 @Autowired Bean
【发布时间】:2021-02-28 06:07:22
【问题描述】:

我有一个类似下面的配置类

@Configuration
public class Configuration {

  @Autowired
  private JdbcTemplate jdbcTemplate;

  @Bean
  SimpleJdbcCall simpleJdbcCall() {
    return new SimpleJdbcCall(jdbcTemplate).withProcedureName("");
  }

}

我正在尝试为此配置类编写单元测试。我的测试类如下所示。

@ContextConfiguration(classes = { Configuration.class })
@RunWith(SpringRunner.class)
public class ConfigurationTest {

  ApplicationContextRunner context = new ApplicationContextRunner()
                                         .withUserConfiguration(Configuration.class);

  @Test
  public void should_check_presence_of_example_service() {
    context.run(it -> {
      assertThat(it).hasSingleBean(SimpleJdbcCall.class);
    });
  }
}

当我在 ConfigurationTest 类中运行测试时,我收到如下错误。

创建名为“配置”的 bean 时出错:不满足的依赖关系 通过字段'jdbcTemplate'表示;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: 否 'org.springframework.jdbc.core.JdbcTemplate' 类型的限定 bean 可用:预计至少有 1 个符合 autowire 条件的 bean 候选人。依赖注解: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

我试图通过在配置类中创建一个 bean jdbcTemplate 并传递数据源来解决这个问题。然后测试单元测试没有找到bean数据源。之后,我在 ConfigurationTest 类中使用了@TestConfiguration 并创建了一个模拟(jdbcTemplate)。那也没用。

【问题讨论】:

  • Nahid bhai,您收到此错误是因为您的测试找不到 JdbcTemplate bean。所以在你的@ContextConfiguration 中,添加另一个包含JdbcTemplate bean 定义的类。然而,由于这些是单元测试(如果这些是功能测试,那么下面的建议不适用),使用真正的JdbcTemplate 是不明智的,因为它可能会调用真正的数据库,因此,创建一个测试配置,创建一个返回JdbcTemplate 的bean,并返回JdbcTemplate 的Mock 实例。
  • 这是春天的靴子还是弹簧靴?
  • 取决于您需要为jdbcTemplate 定义@Bean 及其依赖项,例如DataSource。使用 Spring Boot,可能会提供类似 @DataJpaTest 这样的快捷方式。
  • 这是弹簧靴。我改变了标签。在我在这里问这个问题之前,我已经尝试了提供的解决方案。就我而言,这些解决方案不起作用。我编辑了我的问题来描述这一点。

标签: java spring-boot autowired


【解决方案1】:

我找到了解决我的问题的方法,并且我认为如果有人遇到同样的情况,它可能对其他人有帮助。实际上我的目标是因为公司的要求增加测试覆盖率,下面的解决方案对我有用。

我改变了我的配置类,如下所示

@Configuration
public class Configuration {

  @Bean
  SimpleJdbcCall simpleJdbcCall(DataSource dataSource) {
    return new SimpleJdbcCall(dataSource).withProcedureName("");
  }

} 

我不得不改变我的测试类,如下所示。现在测试类没有抱怨,我得到了 100% 的配置类覆盖率。

@SpringBootTest
public class ConfigurationTest {

  @TestConfiguration
  static class MyConfiguration {
    @Bean
    DataSource dataSource() {
      return mock(DataSource.class);
    }
  }

  @Autowired
  private DataSource dataSource;

  @Autowired
  private Configuration configuration;

  @Test
  public void should_check_presence_of_simpleJdbcCall_Bean() {
    SimpleJdbcCall simpleJdbcCall = configuration.simpleJdbcCall(dataSource);
    Assertions.assertNotNull(simpleJdbcCall);
  }

}

【讨论】:

    猜你喜欢
    • 2018-07-19
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多