Saltar al contenido principal

Spring Boot 3.1.0-M2: Service Connections

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)
  1. Anotación que en conjunto con @Testcontainers manejará el ciclo de vida del contenedor.

  2. Declaración de la implementación del container de Testcontainers, en este caso PostgreSQLContainer.

  3. 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);
}
  1. 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");
  1. @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>