Java 具有多个数据源bean的AutoConfigureTestDatabase

Java 具有多个数据源bean的AutoConfigureTestDatabase,java,spring-boot,datasource,h2,Java,Spring Boot,Datasource,H2,我的应用程序中有两个数据源,当连接到实时环境中的数据库时,它们可以正常工作。然而,在为这个应用程序编写单元测试时,我遇到了bean定义的问题 这是我的主要数据源配置: @Configuration @EnableJpaRepositories( basePackages = "foo.bar.repository.primary", entityManagerFactoryRef = "primaryEntityManager", transact

我的应用程序中有两个数据源,当连接到实时环境中的数据库时,它们可以正常工作。然而,在为这个应用程序编写单元测试时,我遇到了bean定义的问题

这是我的主要数据源配置:

@Configuration
@EnableJpaRepositories(
        basePackages = "foo.bar.repository.primary",
        entityManagerFactoryRef = "primaryEntityManager",
        transactionManagerRef = "primaryTransactionManager")
public class PrimaryDataSourceConfig {

    @Bean
    @Primary
    @ConfigurationProperties("primary.datasource")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @Primary
    public LocalContainerEntityManagerFactoryBean primaryEntityManager() {

        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(primaryDataSource());
        em.setPackagesToScan("foo.bar.domain.entity");

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);

        Map<String, String> properties = new HashMap<>();
        properties.put("hibernate.implicit_naming_strategy",
                "org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy");
        properties.put("hibernate.physical_naming_strategy",
                "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy");
        em.setJpaPropertyMap(properties);

        return em;
    }

    @Bean
    @Primary
    public PlatformTransactionManager primaryTransactionManager() {

        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(primaryEntityManager().getObject());
        return transactionManager;
    }
}

但是,当我运行此测试时,出现以下错误:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'primaryEntityManager' defined in class path resource [foo/bar/primaryDataSourceConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean]: Factory method 'primaryEntityManager' threw exception; nested exception is java.lang.IllegalArgumentException: No visible constructors in class org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceFactoryBean

导致此错误的原因是什么?我可以做些什么来纠正它?Flyway能够连接到批注生成的嵌入式H2实例并运行其迁移,但主数据源及其EntityManager在创建时失败。

我通过执行以下操作解决了问题:

primary.datasource.driver-class-name=org.h2.Driver
primary.datasource.jdbc-url=jdbc:h2:~;MODE=MYSQL
primary.datasource.username=
primary.datasource.password=

secondary.datasource.driver-class-name=org.h2.Driver
secondary.datasource.jdbc-url=jdbc:h2:~;MODE=MYSQL
secondary.datasource.username=
secondary.datasource.password=
首先,我将AutoConfigureTestDatabase注释更改为不替换任何数据源:

@AutoConfigureTestDatabase(
        replace = AutoConfigureTestDatabase.Replace.NONE)
我现在遇到一个错误,我将对数据库超时。由于自动配置默认为内存中的h2,我认为以前的数据库连接设置不正确。我更改了application.properties-file以包含以下内容:

primary.datasource.driver-class-name=org.h2.Driver
primary.datasource.jdbc-url=jdbc:h2:~;MODE=MYSQL
primary.datasource.username=
primary.datasource.password=

secondary.datasource.driver-class-name=org.h2.Driver
secondary.datasource.jdbc-url=jdbc:h2:~;MODE=MYSQL
secondary.datasource.username=
secondary.datasource.password=
发生此错误可能是因为自动配置无法正确替换自定义数据源的entityManager。通过确保数据源未被替换,并确保连接url正确,测试按预期进行