我有一个 Spring Boot 3 项目,我在其中编写使用测试容器运行 PostgreSQL 数据库的集成测试。 我想在一个端点中引入模糊匹配,因此需要 PostgresQL 扩展 pg_trgm。
此外,我阅读了文档,但仍然不清楚我应该如何做这样的事情。
根据我在一些 GitHub 问题中发现的内容,我尝试在测试配置中定义一个 bean,但 testcontainer 似乎并不关心:
@TestConfiguration(proxyBeanMethods = false)
public class DatabaseConfiguration {
@Bean
public PostgreSQLContainer<?> postgreSQLContainer() {
var name = DockerImageName
.parse("localhost/cadonym/database")
.asCompatibleSubstituteFor("postgres");
return new PostgreSQLContainer<>(name);
}
}
图像定义为:
# This image is meant to be used during development only.
FROM docker.io/library/postgres:15.3
ENV POSTGRES_USER=postgres
ENV POSTGRES_PASSWORD=postgres
ENV POSTGRES_DB=cadonym
RUN echo "CREATE EXTENSION pg_trgm" >> /docker-entrypoint-initdb.d/pg_trgm.sql
在运行测试时,我可以看到 testcontainer 基于
docker.io/testcontainers/ryuk:0.5.1
和 docker.io/library/postgres:15.1
创建容器。未使用自定义图像,并且尽管我的测试配置没有改变测试行为:“功能相似性(字符变化,字符变化)不存在”。
我通过将调用“asCompatibleSubstituteFor”(“postgres”)的参数更改为随机值来验证我的配置是否已加载,并且它确实已加载,因为上述更改阻止了上下文按预期加载。
其他相关配置可以在我的测试属性中找到:
spring.datasource.driver-class-name=org.testcontainers.jdbc.ContainerDatabaseDriver
spring.datasource.url=jdbc:tc:postgresql:15.1:///integration-tests-db
缺少的部分是注释@ServiceConnection:
package dev.fita.cadonym;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
import org.springframework.context.annotation.Bean;
import org.testcontainers.containers.PostgreSQLContainer;
import org.testcontainers.utility.DockerImageName;
@TestConfiguration(proxyBeanMethods = false)
public class DatabaseConfiguration {
@Bean
@ServiceConnection
public static PostgreSQLContainer<?> postgreSQLContainer() {
return new PostgreSQLContainer<>(DockerImageName
.parse("localhost/cadonym/database")
.asCompatibleSubstituteFor("postgres"))
.withUsername("api")
.withDatabaseName("cadonym");
}
}