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).