Testes em Java: unit, integration, e2e do A ao Z

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

Introdução: Por que testar em Java?

\n

Todo desenvolvedor Java já passou pela situação em que, após alterar uma única linha de código, todo o sistema "quebrou". Para evitar tais catástrofes, a indústria desenvolveu um sistema robusto de testes. Neste artigo, abordaremos os três níveis de teste em Java: unit (unitário), integration (integração) e e2e (ponta a ponta). Você aprenderá como eles diferem, quais ferramentas usar e como escrever testes em Java corretamente.

\n

Independentemente de você estar escrevendo microsserviços em Spring Boot ou aplicações desktop, entender a pirâmide de testes é uma habilidade essencial. Vamos lá!

\n\n

1. Testes unitários: O alicerce da qualidade

\n

Testes unitários verificam o funcionamento de classes ou métodos individuais, isolados de dependências externas. Este é o nível de teste mais rápido e barato.

\n\n

1.1 Ferramentas principais

\n
    \n
  • JUnit 5 — framework padrão para Java (versão mais recente: Jupiter).
  • \n
  • Mockito — biblioteca para criar objetos mock (simulações).
  • \n
  • AssertJ — biblioteca com um rico conjunto de asserções fluent.
  • \n
\n\n

1.2 Exemplo de teste unitário com JUnit 5 e Mockito

\n

Suponha que temos um serviço UserService que depende do repositório UserRepository:

\n
public class UserService {\n    private final UserRepository repository;\n\n    public UserService(UserRepository repository) {\n        this.repository = repository;\n    }\n\n    public String getUserName(Long id) {\n        User user = repository.findById(id);\n        return user != null ? user.getName() : "Unknown";\n    }\n}
\n

Vamos escrever um teste unitário, isolando a dependência externa com Mockito:

\n
import org.junit.jupiter.api.Test;\nimport org.junit.jupiter.api.extension.ExtendWith;\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.junit.jupiter.MockitoExtension;\n\nimport static org.junit.jupiter.api.Assertions.assertEquals;\nimport static org.mockito.Mockito.when;\n\n@ExtendWith(MockitoExtension.class)\nclass UserServiceTest {\n\n    @Mock\n    private UserRepository userRepository;\n\n    @InjectMocks\n    private UserService userService;\n\n    @Test\n    void testGetUserName_WhenUserExists() {\n        // Arrange\n        User mockUser = new User(1L, "Alice");\n        when(userRepository.findById(1L)).thenReturn(mockUser);\n\n        // Act\n        String result = userService.getUserName(1L);\n\n        // Assert\n        assertEquals("Alice", result);\n    }\n\n    @Test\n    void testGetUserName_WhenUserNotFound() {\n        when(userRepository.findById(99L)).thenReturn(null);\n\n        String result = userService.getUserName(99L);\n\n        assertEquals("Unknown", result);\n    }\n}
\n

Boa prática: um teste — uma verificação. Use nomes de métodos descritivos (por exemplo, testGetUserName_WhenUserExists).

\n\n

2. Testes de integração: Verificando interações

\n

Testes de integração verificam como os componentes do sistema funcionam juntos: banco de dados, sistema de arquivos, APIs externas. Eles são mais lentos que os testes unitários, mas oferecem mais confiança na correção das conexões.

\n\n

2.1 Ferramentas para testes de integração em Java

\n
    \n
  • Spring Boot Test — @SpringBootTest para levantar o contexto da aplicação.
  • \n
  • Testcontainers — execução de bancos de dados reais (PostgreSQL, MySQL) em contêineres Docker.
  • \n
  • H2 — banco de dados in-memory para testes rápidos.
  • \n
\n\n

2.2 Exemplo de teste de integração com Spring Boot e Testcontainers

\n
import org.junit.jupiter.api.Test;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.t                

Blogs

Book Recommendations