Map端口只能在容器启动后获得-使用@ServiceConnection和Spring 3.1.4测试容器

bis0qfac  于 2023-10-16  发布在  Spring
关注(0)|答案(2)|浏览(102)

我正在尝试更新我的测试,以使用 Spring 3.1.4 对testcontainers的最新支持,它 * 将@DynamicSource annotation替换为@ServiceConnection,就像here一样。但是,我得到了这个错误:

Caused by: org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: 
Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: 
Factory method 'dataSource' threw exception with message: 
Mapped port can only be obtained after the container is started

这些是我的依赖:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-testcontainers</artifactId>
   <scope>test</scope>
</dependency>
<dependency>
   <groupId>org.testcontainers</groupId>
   <artifactId>junit-jupiter</artifactId>
   <scope>test</scope>
</dependency>
<dependency>
   <groupId>org.testcontainers</groupId>
   <artifactId>postgresql</artifactId>
   <scope>test</scope>
</dependency>

这里是我的班级:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class FollowshipIT extends BasePostgresConfig {

    @LocalServerPort
    private int port;

    ...

}
public class BasePostgresConfig {

    @Container
    @ServiceConnection
    static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:13.5");

}

我尝试了保持和不保持一个活动的配置文件和-test.yml文件,其中包含像下面这样的数据库文件,并使用@ActiveProfiles(“test”)注解我的BasePostgresConfig类,就像我以前的配置一样,但这也不起作用。

spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver
    url: jdbc:tc:postgresql:13.5:///helloTalk

这是我的应用程序的full code
谢谢

i7uaboj4

i7uaboj41#

你在测试类级别缺少@Testcontainers注解,这将启动和停止用@Container注解的容器实现
您可以查看测试容器JUnit 5文档https://java.testcontainers.org/quickstart/junit_5_quickstart/
要了解有关Testcontainers和JUnit 5集成的更多信息,请参阅https://testcontainers.com/guides/testcontainers-container-lifecycle/
另外,请注意不需要以下代码

spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver
    url: jdbc:tc:postgresql:13.5:///helloTalk

因为PostgreSQL容器是直接使用的。查看更多here

dphi5xsq

dphi5xsq2#

这一方法:

@Testcontainers
public class BasePostgresConfig {

    @Container
    @ServiceConnection
    static PostgreSQLContainer<?> postgres;

    static {
        postgres = new PostgreSQLContainer<>("postgres:13.5");
        postgres.start();
    }

}

也许还有其他方法可以实现这一点,但对于这个解决方案,我必须通过调用postgres.start()在静态块中启动容器。
关于@TestContainers注解,测试在没有它的情况下也能通过,但最好将它保留在那里,这样在测试执行后容器就被关闭了。

更新

经过进一步的调查,我注意到调用postgres.start()的需要似乎与测试具有@TestInstance(Lifecycle.PER_CLASS)注解的事实有关,该注解用于消除@BeforeAll方法为静态的需要。

相关问题