1

我有一个抽象的控制器测试类及其带有单元的继承者,但我想根据他们正在测试的控制器方法将测试分成不同的类。每次我创建第二个测试类并在其中进行测试时,都会出现以下错误:

Failed to validate connection org.postgresql.jdbc.PgConnection@28806954 (This connection has been closed.). Possibly consider using a shorter maxLifetime value.

我有以下基类:

@SpringBootTest
@AutoConfigureMockMvc
@Testcontainers
public abstract class ControllerAbstractTest {
    @Container
    private final static PostgreSQLContainer postgreSQLContainer;

    static {
        postgreSQLContainer = new PostgreSQLContainer<>("postgres:13")
            .withDatabaseName("my-test-db")
            .withUsername("a")
            .withPassword("a");
        postgreSQLContainer.start();

        System.setProperty("spring.datasource.url", postgreSQLContainer.getJdbcUrl());
        System.setProperty("spring.datasource.password", postgreSQLContainer.getPassword());
        System.setProperty("spring.datasource.username", postgreSQLContainer.getUsername());
    }
    // other methods

测试在单个继承者类中工作得很好。

我正在使用org.testcontainers:junit-jupiter:1.16.2相同版本的 postgresql 和spring boot 2.5.6. @Test注释来自org.junit.jupiter.api.Test

我曾尝试添加@Testcontainers继承者并将其从基本测试类中删除,但它没有帮助。

4

1 回答 1

0

我更喜欢在单独的配置中启动容器,这样测试类就不需要扩展特定的抽象类。

/**
 * Starts a database server in a local Docker container.
 */
@TestConfiguration
public class TestDatabaseConfiguration {

    private static final PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer<>("postgres:13")
            .withDatabaseName("my-test-db")
            .withUsername("username")
            .withPassword("password");

    static {
        postgreSQLContainer.start();

        System.setProperty("spring.datasource.url", postgreSQLContainer.getJdbcUrl());
        System.setProperty("spring.datasource.password", postgreSQLContainer.getPassword());
        System.setProperty("spring.datasource.username", postgreSQLContainer.getUsername());
    }
}

想要连接到单个共享数据库服务器的测试类使用以下注释:

@Import(TestDatabaseConfiguration.class)
于 2021-11-24T19:17:44.707 回答