Junit 在 Java 中的配置 class 测试期间无法检测到 @Autowired Bean

Junit cannot detect an @Autowired Bean during a test of a configuration class in Java

我有如下配置class

@Configuration
public class Configuration {

  @Autowired
  private JdbcTemplate jdbcTemplate;

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

}

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

@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 class 中进行测试时,出现如下错误。

Error creating bean with name 'Configuration': Unsatisfied dependency expressed through field 'jdbcTemplate'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.jdbc.core.JdbcTemplate' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

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

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

我更改了配置 class,如下所示

@Configuration
public class Configuration {

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

} 

我不得不像下面这样更改我的测试 class。现在测试 class 没有问题,我得到了配置 class.

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

}