确信这没有被问到,但是通过阅读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。为什么这样做,从而没有通过测试?
正如Kyle和Eugene在下面问到的是其余部分:
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中的上下文中?
答案 0 :(得分:1)
@ComponentScan
会自动将所有找到的@Component
和@Service
注入上下文。您可以通过单独的@Bean
:
@Bean
CustomerService customerService{
return null;
}
或者从@Component
和CustomerService
删除CustomerServiceImpl
注释,但您应该在生产@Bean
@Configuration