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/postgresLa URL JDBC especial de Testcontainers inserta tc: después de jdbc::
jdbc:tc:postgresql:///dbEl 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:///dbEsto 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.sqlTestcontainers 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());
}
}