Overview
Testcontainers es una biblioteca Java que utiliza contenedores Docker para simplificar las pruebas de integración. Crea instancias temporales de bases de datos que se ejecutan durante las pruebas y las elimina automáticamente al finalizarlas.
Este tutorial le muestra cómo utilizar Testcontainers con MongoDB en aplicaciones Java estándar y Spring Boot.
Testes de integração e Testcontainers
Las pruebas de integración comprueban cómo interactúan las diferentes partes de la aplicación. A diferencia de las pruebas unitarias, que validan fragmentos de código individuales, las pruebas de integración verifican que el 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 usan Testcontainers se ejecutan de la misma manera en cualquier computadora y sistema operativo, y cada prueba usa su propia instancia de base de datos. También puede cambiar entre diferentes versiones de la base de datos cuando sea necesario.
Requisitos previos
Antes de comenzar, instale lo siguiente:
Versión de Java 22. Para descargar, consulte Sitio web de Oracle.
Versión 3.9.6 de Maven. Para descargarla, consulte el sitio web de Maven.
Versión 26.0.0 de Docker. Para descargarla, consulte el sitio web de Docker.
También debe agregar las siguientes dependencias a su aplicación: 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.
Agregar 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 consulta devuelve exactamente 2 documentos
Cada documento tiene un campo
titleCada 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 usar la base de datos de prueba:
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 consulta devuelve exactamente 2 documentos
Cada documento tiene un campo
titleCada documento excluye el campo
_id