Teste de Integração Java com Docker: do Início ao Fim
\n\nO teste de integração é uma etapa fundamental do desenvolvimento, permitindo verificar a interação dos componentes da aplicação com sistemas externos: bancos de dados, filas de mensagens, serviços REST. A abordagem tradicional com H2 ou servidores embutidos frequentemente leva a discrepâncias entre os ambientes de teste e produção. A solução é o Docker. Neste artigo, vamos analisar como configurar o teste de integração de aplicações Java com Docker, usando a biblioteca Testcontainers e Docker Compose. Você aprenderá a escrever testes que funcionam com contêineres reais e como integrá-los ao CI/CD.
\n\nPor que Docker para testes de integração?
\nO Docker permite levantar contêineres isolados com versões exatas das dependências (PostgreSQL, Redis, Kafka) imediatamente antes dos testes e destruí-los após. Isso garante:
\n- \n
- Identidade com produção — você testa com um banco de dados real, não com uma emulação. \n
- Isolamento — cada execução de teste começa com um estado limpo. \n
- Execução paralela — várias classes de teste podem usar diferentes contêineres. \n
- Reprodutibilidade — os testes funcionam da mesma forma na máquina local e no CI. \n
Configuração do projeto com Testcontainers
\nTestcontainers é uma biblioteca Java que gerencia o ciclo de vida de contêineres Docker. Vamos adicionar a dependência no pom.xml (Maven):
<dependency>\n <groupId>org.testcontainers</groupId>\n <artifactId>testcontainers</artifactId>\n <version>1.19.3</version>\n <scope>test</scope>\n</dependency>\n<dependency>\n <groupId>org.testcontainers</groupId>\n <artifactId>postgresql</artifactId>\n <version>1.19.3</version>\n <scope>test</scope>\n</dependency>\n<dependency>\n <groupId>org.springframework.boot</groupId>\n <artifactId>spring-boot-starter-test</artifactId>\n <scope>test</scope>\n</dependency>\n\nPara Gradle, adicione no build.gradle:
testImplementation 'org.testcontainers:testcontainers:1.19.3'\ntestImplementation 'org.testcontainers:postgresql:1.19.3'\n\nExemplo: testando um repositório com PostgreSQL
\nVamos considerar um serviço simples para trabalhar com usuários. Criaremos um teste que levanta um contêiner PostgreSQL e verifica a persistência dos dados.
\n\nimport org.junit.jupiter.api.Test;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.DynamicPropertyRegistry;\nimport org.springframework.test.context.DynamicPropertySource;\nimport org.testcontainers.containers.PostgreSQLContainer;\nimport org.testcontainers.junit.jupiter.Container;\nimport org.testcontainers.junit.jupiter.Testcontainers;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\n@Testcontainers\n@SpringBootTest\nclass UserRepositoryTest {\n\n @Container\n static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:15")\n .withDatabaseName("testdb")\n .withUsername("test")\n .withPassword("test");\n\n @DynamicPropertySource\n static void configureProperties(DynamicPropertyRegistry registry) {\n registry.add("spring.datasource.url", postgres::getJdbcUrl);\n registry.add("spring.datasource.username", postgres::getUsername);\n registry.add("spring.datasource.password", postgres::getPassword);\n }\n\n @Autowired\n private UserRepository userRepository;\n\n @Test\n void shouldSaveAndFindUser() {\n User user = new User("john_doe", "john@example