Visão geral
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.
Teste de integração e Testcontainers
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:
Antes dos testes: cria o container, carrega o banco de dados e cria coleções
Durante os testes: executa seu código de teste
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.
Pré-requisitos
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>
Use Testcontainers com Java
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.
Adicionar dados de teste
O seguinte código se conecta ao container e adiciona filmes de amostra:
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)); }
Escrever o teste
O seguinte código executa uma query para filmes com um valor de campo imdb.rating maior que 7 e verifica os 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")); } }
Este teste verifica o seguinte:
A query retorna exatamente 2 documentos
Cada documento tem um campo
titleCada documento exclui o campo
_id
Use Testcontainers com Spring Boot
O exemplo a seguir usa código do repositório Spring Boot MongoDB Aggregations para testar um findAll() método.
Configurar o Spring Boot
O código a seguir configura o Spring Boot para usar o banco de dados de teste:
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"); }
Escrever o teste
O seguinte código testa o 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); }
Este teste verifica o seguinte:
A query retorna exatamente 2 documentos
Cada documento tem um campo
titleCada documento exclui o campo
_id