如何在由 Junit5 启动并由 Spring Boot 配置的测试容器内创建 PostgresQL 扩展

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

我有一个 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
java postgresql spring-boot junit5 testcontainers
1个回答
0
投票

缺少的部分是注释@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");
    }

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