为什么Spring boot的DataJpaTest扫描@Component

时间:2017-07-25 16:52:38

标签: spring spring-boot spring-boot-test

确信这没有被问到,但是通过阅读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中的上下文中?

1 个答案:

答案 0 :(得分:1)

@ComponentScan会自动将所有找到的@Component@Service注入上下文。您可以通过单独的@Bean

覆盖它
@Bean
CustomerService customerService{
    return null;
}

或者从@ComponentCustomerService删除CustomerServiceImpl注释,但您应该在生产@Bean

添加@Configuration