Overview
Testcontainers es una librería de Java que utiliza contenedores de Docker para simplificar las pruebas de integración. Crea instancias de bases de datos temporales que se ejecutan durante tus pruebas y las remueve automáticamente cuando terminan.
Este tutorial te muestra cómo usar Testcontainers con MongoDB, tanto en aplicaciones Java estándar como en Spring Boot.
Testes de integração e Testcontainers
Las pruebas de integración verifican cómo diferentes partes de tu aplicación funcionan juntas. A diferencia de las pruebas unitarias que validan piezas individuales de código, las pruebas de integración verifican que su código interactúe correctamente con sistemas externos, como bases de datos o API.
Testcontainers realiza los siguientes pasos al ejecutar pruebas:
Antes de las pruebas: crea el contenedor, carga la base de datos y crea colecciones
Durante las pruebas: ejecuta su código de prueba
Después de las pruebas: Elimina el contenedor y libera recursos
Las pruebas que utilizan Testcontainers se ejecutan de la misma manera en cualquier ordenador y cualquier sistema operativo, y cada prueba utiliza su propia instancia de base de datos. También puedes cambiar entre diferentes versiones de base de datos cuando sea necesario.
Requisitos previos
Antes de comenzar, instala lo siguiente:
Versión de Java 22. Para descargar, consulta el Sitio web de Oracle.
Versión 3.9.6 de Maven. Para descargarla, consulte el sitio web de Maven.
Versión de Docker 26.0.0. Para descargar, ve al sitio web de Docker.
También debe agregar las siguientes dependencias a su aplicación's pom.xml
archivo:
<dependencyManagement> <dependencies> <!-- MongoDB Java Driver BOM --> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-bom</artifactId> <type>pom</type> <scope>import</scope> </dependency> <!-- Testcontainers BOM --> <dependency> <groupId>org.testcontainers</groupId> <artifactId>testcontainers-bom</artifactId> <type>pom</type> <scope>import</scope> </dependency> <!-- JUnit BOM --> <dependency> <groupId>org.junit</groupId> <artifactId>junit-bom</artifactId> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
Utilice Testcontainers con Java
El siguiente ejemplo prueba una consulta que encuentra películas con calificaciones en IMDb superiores 7.0 a. Para ver el código completo, consulta el repositorio de GitHub.
Agregue datos de prueba
El siguiente código se conecta al contenedor y agrega películas de muestra:
public void setup() { String uri = mongoDBContainer.getConnectionString(); mongoClient = MongoClients.create(uri); database = mongoClient.getDatabase("testdb"); collection = database.getCollection("testCollection"); // Insert sample data Document doc1 = new Document("title", "Inception").append("imdb", new Document("rating", 8.8)); Document doc2 = new Document("title", "The Room").append("imdb", new Document("rating", 3.7)); Document doc3 = new Document("title", "The Dark Knight").append("imdb", new Document("rating", 9.0)); collection.insertMany(List.of(doc1, doc2, doc3)); }
Escribe la prueba
El siguiente código ejecuta una consulta de películas con un valor de campo imdb.rating mayor que 7 y verifica los resultados:
void testMoviesWithHighRating() { List<Document> resultDocuments = new ArrayList<>(); try (MongoCursor<Document> cursor = collection.find(Filters.gt("imdb.rating", 7)) .projection(new Document("title", 1).append("_id", 0)) .iterator()) { while (cursor.hasNext()) { Document doc = cursor.next(); System.out.println(doc.toJson()); resultDocuments.add(doc); } } assertEquals(2, resultDocuments.size()); for (Document doc : resultDocuments) { assertTrue(doc.containsKey("title")); assertFalse(doc.containsKey("_id")); } }
Esta prueba verifica lo siguiente:
La query devuelve exactamente 2 documentos
Cada documento tiene un campo
title.Cada documento excluye el campo
_id
Utilice contenedores de prueba con Spring Boot
El siguiente ejemplo utiliza código del repositorio Spring Boot MongoDB Aggregations para probar un findAll() método.
Configurar Spring Boot
El siguiente código configura Spring Boot para utilizar la base de datos de pruebas:
static void setProperties(DynamicPropertyRegistry registry) { registry.add("spring.data.mongodb.uri", mongoDBContainer::getReplicaSetUrl); registry.add("spring.data.mongodb.database", () -> "testdb"); } public static void setUpAll() { String mongoUri = mongoDBContainer.getConnectionString(); mongoClient = MongoClients.create(mongoUri); } public void setUp() { salesRepository.save(createMockSales()); } private Sales createMockSales() { Item item1 = new Item("Item1", Arrays.asList("Tag1", "Tag2"), new BigDecimal("19.99"), 2); Item item2 = new Item("Item2", Arrays.asList("Tag3", "Tag4"), new BigDecimal("29.99"), 1); List<Item> items = Arrays.asList(item1, item2); Customer customer = new Customer("Male", 30, "customer@example.com", 5); return new Sales(new ObjectId(), new Date(), items, "Store1", customer, true, "Online"); }
Escribe la prueba
El siguiente código prueba el método findAll():
public void testFindAll() { List<Sales> salesList = salesRepository.findAll(); assertThat(salesList).isNotEmpty(); assertThat(salesList.size()).isEqualTo(1); Sales sales = salesList.get(0); assertThat(sales.getStoreLocation()).isEqualTo("Store1"); assertThat(sales.getCustomer().getEmail()).isEqualTo("customer@example.com"); assertThat(sales.getItems()).hasSize(2); }
Esta prueba verifica lo siguiente:
La query devuelve exactamente 2 documentos
Cada documento tiene un campo
title.Cada documento excluye el campo
_id