Spring Boot 3.1.0-M2: Service Connections
- EN
- ES
El pasado viernes 24 de Marzo se liberó la versión 3.1.0-M2 de Spring Boot, la cual añade nuevas anotaciones con la finalidad de reducir la configuración necesaria cuando usamos Testcontainers, resolviendo el issue spring-projects/spring-boot#34658.
A continuación, se muestra un ejemplo de cómo utilizar PostgreSQL
en nuestros tests.
@Container // (1)
private static final PostgreSQLContainer<?> postgresContainer = new PostgreSQLContainer<>("postgres:12") // (2)
.withCopyFileToContainer(MountableFile.forClasspathResource("schema.sql"), "/docker-entrypoint-initdb.d/schema.sql"); // (3)
Anotación que en conjunto con
@Testcontainers
manejará el ciclo de vida del contenedor.Declaración de la implementación del container de Testcontainers, en este caso
PostgreSQLContainer
.El archivo
schema.sql
será copiado en/docker-entrypoint-initdb.d/
para que se ejecute al iniciar el contenedor.
El contenido del script schema.sql
, localizado en src/test/resources
, es el siguiente:
CREATE TABLE users (
id SERIAL,
username VARCHAR(255) NOT NULL,
name VARCHAR(255) NOT NULL,
lastname VARCHAR(255) NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO users (username, name, lastname) VALUES ('eddumelendez', 'Eddú', 'Meléndez');
Tip | Es recomendable usar Liquibase o Flyway para el manejo de migraciones de la base de datos. |
Antes de Spring Boot 3.1.0-M2:
Previo al release de este milestone, era necesario hacer el mapeo manualmente de las propiedades de Testcontainers.
@DynamicPropertySource
static void postgresqlProperties(DynamicPropertyRegistry registry) { // (1)
registry.add("spring.datasource.url", postgresContainer::getJdbcUrl);
registry.add("spring.datasource.username", postgresContainer::getUsername);
registry.add("spring.datasource.password", postgresContainer::getPassword);
}
método estático que ha venido siendo usado para el mapeo correspondiente de properties provenientes de Testcontainers.
Después de Spring Boot 3.1.0-M2
Ahora, haciendo uso de @JdbcServiceConnection
, podemos declarar el contenedor de Testcontainers y Spring Boot se encargará
de hacer el mapeo de las propiedades automáticamente.
@Container
@JdbcServiceConnection // (1)
private static final PostgreSQLContainer<?> postgresContainer = new PostgreSQLContainer<>("postgres:12")
.withCopyFileToContainer(MountableFile.forClasspathResource("schema.sql"), "/docker-entrypoint-initdb.d/schema.sql");
@JdbcServiceConnection
hace el mapeo respectivo de las propiedades de Spring Boot con los valores que provee Testcontainers.
Para mayor información, puedes consultar el siguiente enlace y ver cuáles son las anotaciones disponibles.
Hay otros cambios en esta versión; ya no será necesario declarar el testcontainers-bom
, y para actualizar la versión de
Testcontainers, simplemente debemos actualizar la versión que Spring Boot provee de la siguiente manera:
<testcontainers.version>1.17.6</testcontainers.version>