spring - 测试 Spring Boot Batch 应用程序时如何配置 EntityManagerFactoryBuilder bean?

标签 spring spring-boot spring-data-jpa spring-batch spring-test

我有一个 Spring Boot Batch 应用程序,正在针对它编写集成测试。但是,我在运行测试时收到以下关于缺少 EntityManagerFactoryBuilder bean 的错误:

org.springframework.beans.factory.UnsatisfiedDependencyException: 
Error creating bean with name 'entityManagerFactory' defined in com.example.DatabaseConfig: Unsatisfied dependency expressed through constructor argument with index 0 of type [org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder]: : 
No qualifying bean of type [org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. 
Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No qualifying bean of type [org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
        at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]

我的理解是 Spring Boot 在应用程序启动时提供 EntityManagerFactoryBuilder bean。运行测试时如何提供 EntityManagerFactoryBuilder?

这是我的测试代码:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {DatabaseConfig.class, BatchConfiguration.class})
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class,
        StepScopeTestExecutionListener.class })

public class StepScopeTestExecutionListenerIntegrationTests {

    @Autowired
    private FlatFileItemReader<Foo> reader;

    @Rule
    public TemporaryFolder testFolder = new TemporaryFolder();

    public StepExecution getStepExection() {
        StepExecution execution = MetaDataInstanceFactory.createStepExecution();
        return execution;
    }

    @Test
    public void testGoodData() throws Exception {
       //some test code
    }

这是 DatabaseConfig 类:

@Configuration
@EnableJpaRepositories(basePackages={"com.example.repository"}, 
entityManagerFactoryRef="testEntityManagerFactory",
transactionManagerRef = "testTransactionManager")
public class DatabaseConfig {

    @Bean
    public LocalContainerEntityManagerFactoryBean testEntityManagerFactory(EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(dataSource())
                .packages("com.example.domain")
                .persistenceUnit("testLoad")
                .build();
    }

    @Bean
    @ConfigurationProperties(prefix="spring.datasource")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    public PlatformTransactionManager testTransactionManager(EntityManagerFactory testEntityManagerFactory) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(testEntityManagerFactory);
        return transactionManager;
    }

}

最佳答案

当(集成)测试 Spring Boot 应用程序时,您应该这样做。 @SpringApplicationConfiguration 旨在获取您的应用程序类(带有 @SpringBootApplication 注释的应用程序类),因为随后它将被触发以执行与常规应用程序相同的许多自动配置Spring Boot 应用程序。

您只包含 2 个配置类,因此不会完成自动配置。

关于spring - 测试 Spring Boot Batch 应用程序时如何配置 EntityManagerFactoryBuilder bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34883010/

相关文章:

java - 如何在spring中创建模块

java - 无法命中所需 Controller 的 POST 方法

java - 如何使用 Spring WebClient 禁用 cookie

java - 我的自定义存储库实现中的 CrudRepository

Hibernate Envers 修订之间的增量

spring - JNDI 和 Spring 配置 - jee :lookup

java - 容器管理的持久性和创建临时表的存储过程

java - Spring Activity 将于元旦起火

spring-boot - 如何使用Spring Boot访问VPN中的Elasticsearch Cluster

java - 响应未按照我们的要求正确进行