Escribe pruebas con Testcontainers
Ya tienes lista la implementación de CustomerService, pero para las pruebas necesitas una base de datos PostgreSQL. Puedes usar Testcontainers para levantar una base de datos Postgres en un contenedor Docker y ejecutar tus pruebas contra ella.
Añadir dependencias de Testcontainers
Añade el módulo de Testcontainers PostgreSQL como una dependencia de prueba en pom.xml:
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers-postgresql</artifactId>
<version>2.0.4</version>
<scope>test</scope>
</dependency>Dado que la aplicación utiliza una base de datos Postgres, el módulo Postgres de Testcontainers proporciona una clase PostgreSQLContainer para gestionar el contenedor.
Escribir la prueba
Crea CustomerServiceTest.java bajo src/test/java:
package com.testcontainers.demo;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.List;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.testcontainers.postgresql.PostgreSQLContainer;
class CustomerServiceTest {
static PostgreSQLContainer postgres = new PostgreSQLContainer(
"postgres:16-alpine"
);
CustomerService customerService;
@BeforeAll
static void beforeAll() {
postgres.start();
}
@AfterAll
static void afterAll() {
postgres.stop();
}
@BeforeEach
void setUp() {
DBConnectionProvider connectionProvider = new DBConnectionProvider(
postgres.getJdbcUrl(),
postgres.getUsername(),
postgres.getPassword()
);
customerService = new CustomerService(connectionProvider);
}
@Test
void shouldGetCustomers() {
customerService.createCustomer(new Customer(1L, "George"));
customerService.createCustomer(new Customer(2L, "John"));
List<Customer> customers = customerService.getAllCustomers();
assertEquals(2, customers.size());
}
}Esto es lo que hace la prueba:
- Declara un
PostgreSQLContainercon la imagen de Dockerpostgres:16-alpine. - La función
@BeforeAllinicia el contenedor de Postgres antes de que se ejecute cualquier método de prueba. - La función
@BeforeEachcrea unDBConnectionProviderusando los parámetros de conexión JDBC del contenedor y luego crea unCustomerService. El constructor deCustomerServicecrea la tablacustomerssi no existe. shouldGetCustomers()inserta 2 registros de clientes, obtiene todos los clientes y verifica la cantidad.- La función
@AfterAlldetiene el contenedor después de que finalizan todos los métodos de prueba.