【问题标题】:how to use @DataJpaTest with multiple datasourse如何将@DataJpaTest 与多个数据源一起使用
【发布时间】:2016-08-26 13:42:43
【问题描述】:

我尝试使用注释 @DataJpaTest 编写集成测试。 我有两个数据源:主要和次要(类配置) 结果我有一个错误:

expected single matching bean but found 2: primaryDataSource,secondary

然后我尝试添加注释

@AutoConfigureTestDatabase(replace= AutoConfigureTestDatabase.Replace.AUTO_CONFIGURED)

并且使用 AUTO_CONFIGURED 只有由属性配置的数据源将被替换,而是嵌入 h2 我看到了Dialect : HHH000400: Using dialect: org.hibernate.dialect.Oracle10gDialect

如何将@DataJpaTest 与多个数据源一起使用?

public class DataSourcesConfig {


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

    @Bean(name = "secondary")
    @ConfigurationProperties(prefix="datasource.secondary")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }

}

【问题讨论】:

  • 您找到解决方案了吗?

标签: spring-boot


【解决方案1】:

我有一个@Primary 配置类

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        basePackages = {"com.something"}
)
public class APrimaryDBDBConfiguration {

    @Primary
    @Bean
    @ConfigurationProperties("spring.datasource")
    public DataSourceProperties dataSourceProperties() {
        return new DataSourceProperties();
    }

    @Primary
    @Bean(name = "dataSource")
    @ConfigurationProperties("spring.datasource.hikari")
    public HikariDataSource dataSource() {
        return dataSourceProperties()
                .initializeDataSourceBuilder()
                .type(HikariDataSource.class).build();
    }

    @Primary
    @Bean(name = "entityManagerFactory")
    @Profile("!test")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
            EntityManagerFactoryBuilder builder,
            @Qualifier("dataSource") DataSource dataSource) {
        return builder
                .dataSource(dataSource)
                .packages("com")
                .persistenceUnit("some_persistence_unit")
                .build();
    }

    @Primary
    @Bean(name = "transactionManager")
    public PlatformTransactionManager transactionManager(
            @Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
}

稍后,在我的存储库中测试类:

@RunWith(SpringRunner.class)
@DataJpaTest
@ActiveProfiles("test")
@Import(APrimaryDBDBConfiguration.class)

最后,我的测试属性有:

spring.jpa.hibernate.ddl-auto=create-drop

【讨论】:

    【解决方案2】:

    检查是否在测试范围内添加了 h2 数据库作为依赖项。如果没有,添加并尝试:

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>test</scope>
        </dependency>
    

    【讨论】:

      【解决方案3】:

      找到了一个可能的解决方案here

      基本上你手动适当地配置 H2 数据库,而不是让 Spring 自动完成。

      在“src/test/resources”中创建一个application.properties文件,内容如下

      # Let Spring autodetect the different SQL Dialects of each datasource
      spring.jpa.database=default
      # Generate the DB schema in the In-Memory H2 databases based on the JPA Entities
      spring.jpa.generate-ddl=true
      
      # H2 In-Memory Database "foo" (used in tests instead of a real PostgreSQL DB)
      spring.datasource.url=jdbc:h2:mem:foo;DB_CLOSE_ON_EXIT=FALSE
      spring.datasource.username=sa
      spring.datasource.password=
      spring.datasource.driver-class-name=org.h2.Driver
      
      # H2 In-Memory Database "bar" (used in tests instead of a real PostgreSQL DB)
      bar.datasource.url=jdbc:h2:mem:bar;DB_CLOSE_ON_EXIT=FALSE
      bar.datasource.username=sa
      bar.datasource.password=
      bar.datasource.driver-class-name=org.h2.Driver
      

      【讨论】:

      • 这没什么用。您如何构建bar 数据源?并且使用@SpringBootTest 不是切片测试,因为它会加载所有应用程序上下文
      • Spring 本身会根据上述属性的命名约定为您创建数据源。如果您不喜欢@SpringBootTest,那么您可以使用@RunWith(SpringJUnit4ClassRunner.class) 和其他Spring 注解(例如@ContextConfiguration)来控制您的应用程序的哪些部分包含在类中。
      猜你喜欢
      • 2019-12-27
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      • 2016-07-28
      • 2011-10-10
      • 2015-06-14
      • 1970-01-01
      相关资源
      最近更新 更多