Docs Menu
Docs Home
/ /

Pruebas de integración con Java y MongoDB mediante Testcontainers

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.

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:

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

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>

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 consulta 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 usar la base de datos de prueba:

@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 consulta devuelve exactamente 2 documentos

  • Cada documento tiene un campo title

  • Cada documento excluye el campo _id

Volver

Quarkus con Panache y MongoDB

En esta página