Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Pruebas de integración con Java y MongoDB utilizando Testcontainers

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.

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:

  1. Antes de las pruebas: crea el contenedor, carga la base de datos y crea colecciones

  2. Durante las pruebas: ejecuta su código de prueba

  3. 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.

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>

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.

1

El siguiente código crea un contenedor MongoDB. La anotación @Container inicia el contenedor antes de las pruebas y lo detiene una vez finalizadas:

@Container
private static final MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:7.0.0");
2

El siguiente código se conecta al contenedor y agrega películas de muestra:

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

El siguiente código ejecuta una consulta de películas con un valor de campo imdb.rating mayor que 7 y verifica los resultados:

@Test
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

El siguiente ejemplo utiliza código del repositorio Spring Boot MongoDB Aggregations para probar un findAll() método.

1

El siguiente código crea un contenedor MongoDB:

@Container
public static MongoDBContainer mongoDBContainer = new MongoDBContainer(DockerImageName.parse("mongo:7.0.0"));
2

El siguiente código configura Spring Boot para utilizar la base de datos de pruebas:

@DynamicPropertySource
static void setProperties(DynamicPropertyRegistry registry) {
registry.add("spring.data.mongodb.uri", mongoDBContainer::getReplicaSetUrl);
registry.add("spring.data.mongodb.database", () -> "testdb");
}
@BeforeAll
public static void setUpAll() {
String mongoUri = mongoDBContainer.getConnectionString();
mongoClient = MongoClients.create(mongoUri);
}
@BeforeEach
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");
}
3

El siguiente código prueba el método findAll():

@Test
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

Volver

Paginación de datos con Java y Quarkus

En esta página