Compartir comentarios
Las respuestas se generan en base a la documentación.

Anotaciones de extensión de JUnit 5


La biblioteca Testcontainers proporciona una extensión de JUnit 5 que simplifica el inicio y la detención de contenedores mediante el uso de anotaciones. Para usarla, añade la dependencia de prueba org.testcontainers:testcontainers-junit-jupiter.

package com.testcontainers.demo;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;

import java.util.List;
import java.util.Optional;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.testcontainers.postgresql.PostgreSQLContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;

@Testcontainers
class CustomerServiceWithJUnit5ExtensionTest {

  @Container
  static PostgreSQLContainer postgres = new PostgreSQLContainer(
    "postgres:16-alpine"
  );

  CustomerService customerService;

  @BeforeEach
  void setUp() {
    customerService =
    new CustomerService(
      postgres.getJdbcUrl(),
      postgres.getUsername(),
      postgres.getPassword()
    );
    customerService.deleteAllCustomers();
  }

  @Test
  void shouldCreateCustomer() {
    customerService.createCustomer(new Customer(1L, "George"));

    Optional<Customer> customer = customerService.getCustomer(1L);
    assertTrue(customer.isPresent());
    assertEquals(1L, customer.get().id());
    assertEquals("George", customer.get().name());
  }

  @Test
  void shouldGetCustomers() {
    customerService.createCustomer(new Customer(1L, "George"));
    customerService.createCustomer(new Customer(2L, "John"));

    List<Customer> customers = customerService.getAllCustomers();
    assertEquals(2, customers.size());
  }
}

En lugar de iniciar y detener manualmente el contenedor en @BeforeAll y @AfterAll, la anotación @Testcontainers en la clase y la anotación @Container en el campo se encargan de ello de forma automática:

  • La extensión busca todos los campos anotados con @Container.
  • Los campos estáticos (static fields) se inician una vez antes de todas las pruebas y se detienen después de todas ellas.
  • Los campos de instancia (instance fields) se inician antes de cada prueba y se detienen después de cada una (no se recomienda, ya que consume muchos recursos).