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