junit无法在java中测试配置类时检测到@autowiredbean

plicqrtu  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(291)

我有如下配置类

@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 同学们,我遇到了一个类似下面的错误。
创建名为“configuration”的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并 Package 了一个mock(jdbctemplate)。这也不管用。

ffscu2ro

ffscu2ro1#

我找到了解决我问题的方法,我想如果有人遇到同样的情况,可能会对其他人有所帮助。实际上,由于公司的要求,我的目标是增加测试覆盖率,下面的解决方案适合我。
我改变了我的配置类如下

@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);
  }

}

相关问题