Spring Boot 测试:如何将 DataSource 替换为由 Testcontainers 管理的数据源

问题描述 投票:0回答:1

我使用本地 PGSQL DB 测试了我的 Spring Boot 应用程序。现在我想修改测试以使用在测试容器中运行的 PGSQL。

我修改了测试配置类以使用 Testcontainers 并公开连接到 Testcontainers 返回的端口的数据源:

@TestConfiguration
@SpringBootApplication(exclude = { HazelcastAutoConfiguration.class })
@ComponentScan(basePackages = { "rw.gov.dgie.tm" })
@EntityScan("rw.gov.dgie.tm")
@EnableJpaRepositories(basePackages = { "rw.gov.dgie.tm" })
@EnableAsync(proxyTargetClass = true)
@EnableTransactionManagement
@Testcontainers
public class DbTestConfig {
@Autowired
private DataSource dataSource;

@SuppressWarnings("resource")
@Container
    public static ComposeContainer dockerComposeContainer =
        new ComposeContainer(new File("../docker/catalog-test.yml"))
                .withExposedService("db-catalog", 5432)
                .withRemoveVolumes(false)
                .withLocalCompose(true)
                .waitingFor("db-catalog", new DockerHealthcheckWaitStrategy());

@Bean
    public DataSource dataSource(){
    DriverManagerDataSource source = new DriverManagerDataSource();
    String url = "jdbc:postgresql://" + dockerComposeContainer.getServiceHost("db-catalog", 5432) + ":" + dockerComposeContainer.getServicePort("db-catalog", 5432) + "/db-catalog";
    source.setDriverClassName("org.postgresql.Driver");
    source.setUrl(url);
    source.setUsername("sa");
    source.setPassword("sa");
    return source;
}

}

我正在使用以下 application-test.yml 文件:

  datasource:
      type: com.zaxxer.hikari.HikariDataSource
      driver-class-name: org.postgresql.Driver
      url: jdbc:postgresql://localhost:5432/db_catalog
      username: db_catalog
      password: qwerty
      hikari:
        poolName: Hikari
        auto-commit: false
    jpa:
      show-sql: true
      generate-ddl: true
      properties:
        hibernate:
          dialect: org.hibernate.dialect.PostgreSQLDialect
          ddl-auto: update
          generate_statistics: false

但是,当运行本地数据库运行正常的测试时,出现以下异常:

org.springframework.beans.factory.BeanCreationException:创建类路径资源[org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]中定义的名为“entityManagerFactory”的bean时出错:无法初始化依赖项“dataSourceScriptDatabaseInitializer” LoadTimeWeaverAware bean“entityManagerFactory”:创建类路径资源[org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]中定义的名为“dataSourceScriptDatabaseInitializer”的bean时出错:通过方法“dataSourceScriptDatabaseInitializer”参数0表示的依赖关系不满足:创建时出错名称为“dbTestConfig”的 bean:通过字段“dataSource”表达的依赖关系不满足:创建名称为“dataSource”的 bean 时出错:当前正在创建请求的 bean:是否存在无法解析的循环引用?

我该如何处理?

java spring spring-boot testcontainers
1个回答
0
投票

几件事:

  • TestContainers 应该仅用于测试,因此将它们移至 测试类文件夹。
  • 删除@Autowired私有数据源dataSource
    数据库测试配置。该类负责创建数据源 bean。
  • 请使用 PostgreSQLContainer 而不是 ComposeContainer

更多详情参考

© www.soinside.com 2019 - 2024. All rights reserved.