我正在尝试更新我的测试,以使用 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。
谢谢
2条答案
按热度按时间i7uaboj41#
你在测试类级别缺少
@Testcontainers
注解,这将启动和停止用@Container
注解的容器实现您可以查看测试容器JUnit 5文档https://java.testcontainers.org/quickstart/junit_5_quickstart/
要了解有关Testcontainers和JUnit 5集成的更多信息,请参阅https://testcontainers.com/guides/testcontainers-container-lifecycle/。
另外,请注意不需要以下代码
因为PostgreSQL容器是直接使用的。查看更多here
dphi5xsq2#
这一方法:
也许还有其他方法可以实现这一点,但对于这个解决方案,我必须通过调用
postgres.start()
在静态块中启动容器。关于
@TestContainers
注解,测试在没有它的情况下也能通过,但最好将它保留在那里,这样在测试执行后容器就被关闭了。更新
经过进一步的调查,我注意到调用
postgres.start()
的需要似乎与测试具有@TestInstance(Lifecycle.PER_CLASS)
注解的事实有关,该注解用于消除@BeforeAll
方法为静态的需要。