# 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`:

```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`:

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

