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

Reemplazar H2 con la URL JDBC de Testcontainers

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

@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í:

jdbc:postgresql://localhost:5432/postgres

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

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:

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:

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:

@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());
  }
}