Teste de Integração Java com Docker: Guia Completo

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Teste de Integração Java com Docker: do Início ao Fim

\n\n

O 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\n

Por que Docker para testes de integração?

\n

O 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
\n\n

Configuração do projeto com Testcontainers

\n

Testcontainers é uma biblioteca Java que gerencia o ciclo de vida de contêineres Docker. Vamos adicionar a dependência no pom.xml (Maven):

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

Para Gradle, adicione no build.gradle:

\n
testImplementation 'org.testcontainers:testcontainers:1.19.3'\ntestImplementation 'org.testcontainers:postgresql:1.19.3'
\n\n

Exemplo: testando um repositório com PostgreSQL

\n

Vamos 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\n
import 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                

Blogs

Book Recommendations