You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JUnit5启动、Spring Boot配置的Testcontainers中创建PostgreSQL扩展

问题分析与解决方案

核心问题

你定义的PostgreSQLContainer Bean未生效,是因为你使用了Testcontainers的JDBC URL自动启动模式(jdbc:tc:postgresql:15.1:///...),这种模式会独立创建容器,完全忽略手动定义的PostgreSQLContainer Bean——两种启动方式互斥,只能二选一。


解决方案1:无需自定义镜像,直接加载pg_trgm扩展

这种方式更轻量,不用维护自定义Docker镜像,直接在测试阶段执行扩展初始化:

方式A:用@Sql注解执行初始化脚本

  1. 保留原JDBC URL配置,删除自定义的PostgreSQLContainer Bean
  2. 在测试类上添加注解指定初始化脚本:
@SpringBootTest
@Sql(scripts = "classpath:init-pg-trgm.sql")
public class YourIntegrationTest {
    // 测试逻辑
}
  1. 在src/test/resources下创建init-pg-trgm.sql:
CREATE EXTENSION IF NOT EXISTS pg_trgm;

方式B:通过JDBC URL参数指定初始化脚本

直接在数据源URL中添加初始化脚本参数,无需修改测试类:

spring.datasource.url=jdbc:tc:postgresql:15.1:///integration-tests-db?TC_INITSCRIPT=classpath:init-pg-trgm.sql

解决方案2:使用自定义镜像(手动管理容器)

如果一定要用预构建好的自定义镜像,需要修改配置让Spring Boot使用你定义的容器:

  1. 删除application-test.properties中的以下配置:
spring.datasource.driver-class-name=org.testcontainers.jdbc.ContainerDatabaseDriver
spring.datasource.url=jdbc:tc:postgresql:15.1:///integration-tests-db
  1. 修改DatabaseConfiguration,暴露数据源连接属性:
@TestConfiguration(proxyBeanMethods = false)
public class DatabaseConfiguration {

    @Bean
    public PostgreSQLContainer<?> postgreSQLContainer() {
        DockerImageName imageName = DockerImageName
                .parse("localhost/cadonym/database")
                .asCompatibleSubstituteFor("postgres");
        return new PostgreSQLContainer<>(imageName)
                .withDatabaseName("integration-tests-db")
                .withUsername("postgres")
                .withPassword("postgres");
    }

    @Bean
    @Primary
    public DataSource dataSource(PostgreSQLContainer<?> postgreSQLContainer) {
        return DataSourceBuilder.create()
                .driverClassName(postgreSQLContainer.getDriverClassName())
                .url(postgreSQLContainer.getJdbcUrl())
                .username(postgreSQLContainer.getUsername())
                .password(postgreSQLContainer.getPassword())
                .build();
    }
}
  1. 在测试类上导入该配置:
@SpringBootTest
@Import(DatabaseConfiguration.class)
public class YourIntegrationTest {
    // 测试逻辑
}

额外验证点

  • 确保自定义镜像已正确构建:在Dockerfile目录执行docker build -t localhost/cadonym/database .
  • 查看容器启动日志,确认CREATE EXTENSION pg_trgm脚本是否执行成功

内容的提问来源于stack exchange,提问作者Adrien H

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 21:40:19