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

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 PostgreSQLContainer con la imagen de Docker postgres:16-alpine.
  • La función @BeforeAll inicia el contenedor de Postgres antes de que se ejecute cualquier método de prueba.
  • La función @BeforeEach crea un DBConnectionProvider usando los parámetros de conexión JDBC del contenedor y luego crea un CustomerService. El constructor de CustomerService crea la tabla customers si no existe.
  • shouldGetCustomers() inserta 2 registros de clientes, obtiene todos los clientes y verifica la cantidad.
  • La función @AfterAll detiene el contenedor después de que finalizan todos los métodos de prueba.