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);
}
}
我有如下配置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);
}
}