如何在JUnit5启动、Spring Boot配置的Testcontainers中创建PostgreSQL扩展
问题分析与解决方案
核心问题
你定义的PostgreSQLContainer Bean未生效,是因为你使用了Testcontainers的JDBC URL自动启动模式(jdbc:tc:postgresql:15.1:///...),这种模式会独立创建容器,完全忽略手动定义的PostgreSQLContainer Bean——两种启动方式互斥,只能二选一。
解决方案1:无需自定义镜像,直接加载pg_trgm扩展
这种方式更轻量,不用维护自定义Docker镜像,直接在测试阶段执行扩展初始化:
方式A:用@Sql注解执行初始化脚本
- 保留原JDBC URL配置,删除自定义的
PostgreSQLContainerBean - 在测试类上添加注解指定初始化脚本:
@SpringBootTest @Sql(scripts = "classpath:init-pg-trgm.sql") public class YourIntegrationTest { // 测试逻辑 }
- 在
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使用你定义的容器:
- 删除
application-test.properties中的以下配置:
spring.datasource.driver-class-name=org.testcontainers.jdbc.ContainerDatabaseDriver spring.datasource.url=jdbc:tc:postgresql:15.1:///integration-tests-db
- 修改
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(); } }
- 在测试类上导入该配置:
@SpringBootTest @Import(DatabaseConfiguration.class) public class YourIntegrationTest { // 测试逻辑 }
额外验证点
- 确保自定义镜像已正确构建:在Dockerfile目录执行
docker build -t localhost/cadonym/database . - 查看容器启动日志,确认
CREATE EXTENSION pg_trgm脚本是否执行成功
内容的提问来源于stack exchange,提问作者Adrien H
相关产品推荐
相关产品推荐

