Menu Docs
Página inicial do Docs
/ /

Teste de integração com Java e MongoDB usando Testcontainers

Testcontainers é uma biblioteca Java que usa contêineres Docker para simplificar o teste de integração. Ele cria instâncias de banco de dados temporárias que são executadas durante seus testes e as remove automaticamente quando os testes terminam.

Este tutorial mostra como usar o Testcontainers com o MongoDB em aplicativos Java padrão e Spring Boot.

O teste de integração verifica como diferentes partes do seu aplicativo funcionam juntas. Ao contrário dos testes de unidade que validam partes individuais de código, os testes de integração verificam se seu código realiza a interação correta com sistemas externos, como bancos de dados ou APIs.

O Testcontainers executa as seguintes etapas ao executar testes:

  1. Antes dos testes: cria o contêiner, carrega o banco de dados e cria coleções

  2. Durante os testes: executa seu código de teste

  3. Após os testes: Remover o contêiner e liberar recursos

Os testes que usam Testcontainers são executados da mesma maneira em qualquer computador e qualquer sistema operacional, e cada teste usa sua própria instância de banco de dados. Você também pode alternar entre diferentes versões do banco de dados quando necessário.

Antes de começar, instale o seguinte:

  • Versão Java 22. Para baixar, consulte o website da Oracle.

  • Versão do Maven 3.9.6. Para fazer o download, consulte o site da Maven.

  • Docker versão 26.0.0. Para fazer o download, consulte o site do Docker.

Você também deve adicionar as seguintes dependências ao arquivo pom.xml do seu aplicativo:

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

O exemplo a seguir testa uma query que encontra filmes com classificações do IMDb acima de 7.0. Para visualizar o código completo, consulte o repositório GitHub.

1

O seguinte código cria um contêiner MongoDB. A anotação @Container inicia o contêiner antes dos testes e o interrompe após a conclusão dos testes:

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

O seguinte código se conecta ao contêiner e adiciona filmes de amostra:

@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

O seguinte código executa uma query para filmes com um valor de campo imdb.rating maior que 7 e verifica os 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"));
}
}

Este teste verifica o seguinte:

  • A query retorna exatamente 2 documentos

  • Cada documento tem um campo title

  • Cada documento exclui o campo _id

O exemplo a seguir usa código do repositório Spring Boot MongoDB Agregações para testar um método findAll().

1

O seguinte código cria um contêiner MongoDB :

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

O código a seguir configura o Spring Boot para usar o banco de dados de teste:

@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

O seguinte código testa o 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);
}

Este teste verifica o seguinte:

  • A query retorna exatamente 2 documentos

  • Cada documento tem um campo title

  • Cada documento exclui o campo _id

Voltar

Quarkus com Panache e MongoDB

Nesta página