gpt4 book ai didi

spring - 为什么spring boot的DataJpaTest会扫描@Component

转载 作者:行者123 更新时间:2023-12-04 06:28:57 25 4
gpt4 key购买 nike

确信这没有被问到,但是通过阅读 Spring 文档和测试实用程序我发现了这个 annotation并认为我会开始使用它。阅读我读到的细则:
常规 @Component bean 不会加载到 ApplicationContext 中。

这听起来不错,我什至喜欢使用 H2 的想法,除了我发现我想使用的实体有目录和模式修饰符,而默认的 H2 我不知道如何支持它。我为测试分支创建了一个 H2 数据源并使用它并覆盖替换。我结束了

@RunWith(SpringRunner.class)
@ContextConfiguration(classes=ABCH2Congfiguration.class)
@DataJpaTest
@AutoConfigureTestDatabase(replace= AutoConfigureTestDatabase.Replace.NONE)
public class StatusRepositoryTest {

}

但是我的测试失败了原因:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有符合条件的bean类型。
这导致:
创建名为“customerServiceImpl”的 bean 时出错:依赖项不满足。

然而 customerServiceImpl 是这个 bean:
@Component
public class CustomerServiceImpl implements CustomerService {
}

那就是@Component。 DataJpaTest 的细则说它不加载@Components。为什么它会这样做并因此未能通过测试?

正如凯尔和尤金在下面问的那样,剩下的就是:
package com.xxx.abc.triage;
@Component
public interface CustomerService {
}

Configuration
@ComponentScan("com.xxx.abc")
@EnableJpaRepositories("com.xxx.abc")
//@Profile("h2")
public class ABMH2Congfiguration {

@Primary
@Bean(name = "h2source")
public DataSource dataSource() {
EmbeddedDatabase build = new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).setName("ABC").addScript("init.sql").build();
return build;
}

@Bean
public JpaVendorAdapter jpaVendorAdapter() {
HibernateJpaVendorAdapter bean = new HibernateJpaVendorAdapter();
bean.setDatabase(Database.H2);
bean.setShowSql(true);
bean.setGenerateDdl(true);
return bean;
}

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
DataSource dataSource, JpaVendorAdapter jpaVendorAdapter) {
LocalContainerEntityManagerFactoryBean bean = new LocalContainerEntityManagerFactoryBean();
bean.setDataSource(dataSource);
bean.setJpaVendorAdapter(jpaVendorAdapter);
bean.setPackagesToScan("com.xxx.abc");
return bean;
}

@Bean
public JpaTransactionManager transactionManager(EntityManagerFactory emf) {
return new JpaTransactionManager(emf);
}

}

为了澄清这个问题,为什么@Component 被加载到@DataJpaTest 中的上下文中?

最佳答案

@DataJpaTest不加载 @Component , @Service ... 默认情况下,只有 @Repository以及配置 Spring 数据 JPA 所需的内部事物。
在您的测试中,您可以加载任何 @Configuration你需要,在你的情况下,你加载 @ABMH2Congfiguration它执行 @ComponentScan这就是为什么 Spring 尝试加载您的 CustomerService .
您应该只扫描 @Repository在此配置类中,并扫描其他@Component , @Service ... 在另一个 @Configuration喜欢 DomainConfiguration .区分不同类型的配置始终是一个好习惯。

关于spring - 为什么spring boot的DataJpaTest会扫描@Component,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45309405/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com