MongoDB.local SF, Jan 15: See the speaker lineup & ship your AI vision faster. Use WEB50 to save 50%
Find out more >
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 aplicação 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 interage corretamente com sistemas externos, como bancos de dados ou APIs.

O Testcontainers executa as seguintes etapas ao executar testes:

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

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

  3. Após os testes: Remove o container e libera 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 fazer download, consulte o site da Oracle do.

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

  • Docker 26.0.0 versão. 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 7.0 de. 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 container 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 container 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 Aggregations para testar um findAll() método.

1

O seguinte código cria um container 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

Quakus com Panache e MongoDB

Nesta página