# Reemplazar H2 con la URL JDBC de Testcontainers


Reemplazar H2 con una base de datos PostgreSQL real requiere dos propiedades de prueba:

```java
@DataJpaTest
@TestPropertySource(properties = {
  "spring.test.database.replace=none",
  "spring.datasource.url=jdbc:tc:postgresql:16-alpine:///db"
})
class ProductRepositoryWithJdbcUrlTest {

  @Autowired
  ProductRepository productRepository;

  @Test
  @Sql("classpath:/sql/seed-data.sql")
  void shouldGetAllProducts() {
    List<Product> products = productRepository.findAll();
    assertEquals(2, products.size());
  }
}
```

Eso es todo: dos propiedades y tus pruebas se ejecutan contra una base de datos
PostgreSQL real.

## Cómo funciona la URL JDBC especial

Una URL JDBC estándar de PostgreSQL se ve así:

```text
jdbc:postgresql://localhost:5432/postgres
```

La URL JDBC especial de Testcontainers inserta `tc:` después de `jdbc:`:

```text
jdbc:tc:postgresql:///db
```

El nombre de host, el puerto y el nombre de la base de datos se ignoran;
Testcontainers los gestiona automáticamente. Puedes especificar la etiqueta (tag)
de la imagen Docker después del nombre de la base de datos:

```text
jdbc:tc:postgresql:16-alpine:///db
```

Esto crea un contenedor a partir de la imagen `postgres:16-alpine`.

## Inicializar la base de datos con un script

Pasa `TC_INITSCRIPT` para ejecutar un script SQL cuando se inicie el contenedor:

```text
jdbc:tc:postgresql:16-alpine:///db?TC_INITSCRIPT=sql/init-db.sql
```

Testcontainers ejecuta el script automáticamente. Para aplicaciones de producción,
utiliza en su lugar una herramienta de migración de bases de datos como Flyway o
Liquibase.

La URL JDBC especial también funciona para MySQL, MariaDB, PostGIS, YugabyteDB,
CockroachDB y otras bases de datos compatibles con la integración JDBC de
Testcontainers.

## Probar repositorios basados en JdbcTemplate

El mismo enfoque funciona para los repositorios basados en `JdbcTemplate`. Utiliza
`@JdbcTest` en lugar de `@DataJpaTest`:

```java
@JdbcTest
@TestPropertySource(properties = {
  "spring.test.database.replace=none",
  "spring.datasource.url=jdbc:tc:postgresql:16-alpine:///db?TC_INITSCRIPT=sql/init-db.sql"
})
class JdbcProductRepositoryTest {

  @Autowired
  private JdbcTemplate jdbcTemplate;

  private JdbcProductRepository productRepository;

  @BeforeEach
  void setUp() {
    productRepository = new JdbcProductRepository(jdbcTemplate);
  }

  @Test
  @Sql("/sql/seed-data.sql")
  void shouldGetAllProducts() {
    List<Product> products = productRepository.getAllProducts();
    assertEquals(2, products.size());
  }
}
```

