JUnit em Java
Exemplos Práticos e Boas Práticas para
Testes Eficazes
JUnit é uma biblioteca de testes essencial para o desenvolvimento de software
em Java, permitindo a criação de testes automatizados que asseguram a
funcionalidade e a qualidade do código.
A implementação de testes, especialmente em projetos complexos
desenvolvidos com frameworks como Spring Boot e JSP, é crucial para garantir
que novas alterações não introduzam bugs.
Este artigo explora uma ampla gama de exemplos práticos do JUnit,
apresentando 50 casos de teste comentados em alto nível para auxiliar
desenvolvedores a adotar boas práticas na implementação de testes
automatizados.
Exemplos Didáticos de JUnit
1. Teste Simples de Soma
import [Link];
import static [Link].*;
public class CalculadoraTest {
@Test
public void testSoma() {
Calculadora calc = new Calculadora();
// Verifica se 2 + 3 resulta em 5
assertEquals(5, [Link](2, 3), "A soma deve ser 5");
}
}
2. Teste de Subtração
@Test
public void testSubtracao() {
Calculadora calc = new Calculadora();
// Verifica se 5 - 3 resulta em 2
assertEquals(2, [Link](5, 3), "A subtração deve ser 2");
}
3. Teste de Multiplicação
@Test
public void testMultiplicacao() {
Calculadora calc = new Calculadora();
// Verifica se 4 * 2 resulta em 8
assertEquals(8, [Link](4, 2), "A multiplicação deve ser 8");
}
4. Teste de Divisão
@Test
public void testDivisao() {
Calculadora calc = new Calculadora();
// Verifica se 10 / 2 resulta em 5
assertEquals(5, [Link](10, 2), "A divisão deve ser 5");
}
5. Teste de Exceção (Divisão por Zero)
@Test
public void testDivisaoPorZero() {
Calculadora calc = new Calculadora();
// Verifica se uma exceção é lançada ao dividir por zero
assertThrows([Link], () -> [Link](10, 0));
}
6. Teste de Inicialização com @BeforeEach
import [Link];
public class UsuarioServiceTest {
private UsuarioService usuarioService;
@BeforeEach
void setUp() {
// Inicializa o serviço antes de cada teste
usuarioService = new UsuarioService();
}
@Test
public void testCadastrarUsuario() {
Usuario usuario = new Usuario("Maria");
[Link](usuario);
// Verifica se o usuário foi adicionado
assertNotNull([Link]("Maria"));
}
}
7. Teste com @ParameterizedTest
import [Link];
import [Link];
public class CalculadoraTest {
@ParameterizedTest
@ValueSource(ints = {2, 4, 6})
void testPar(int numero) {
// Verifica se o número é par
assertTrue(numero % 2 == 0, numero + " deve ser par");
}
}
8. Mocking com Mockito
import static [Link].*;
import [Link];
import [Link];
import [Link];
public class UsuarioServiceTest {
@Mock
private UsuarioRepository usuarioRepository;
@InjectMocks
private UsuarioService usuarioService;
@BeforeEach
void setUp() {
[Link](this);
}
@Test
void testBuscarUsuarioPorId() {
Usuario usuario = new Usuario(1L, "João");
when([Link](1L)).thenReturn([Link](usuario));
// Verifica se o nome do usuário encontrado é "João"
assertEquals("João", [Link](1L).getNome());
}
}
9. Teste de Integração com Spring Boot
import [Link];
import [Link];
import [Link];
import [Link];
@SpringBootTest
@AutoConfigureMockMvc
public class UsuarioControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testGetUsuario() throws Exception {
[Link](get("/usuarios/1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.nome").value("João"));
}
}
10. Teste de CRUD em um Controlador
@Test
public void testCriarUsuario() throws Exception {
Usuario usuario = new Usuario("Maria");
[Link](post("/usuarios")
.contentType(MediaType.APPLICATION_JSON)
.content("{\"nome\": \"Maria\"}"))
.andExpect(status().isCreated());
}
11. Teste de Endpoints com Cabeçalhos
java
@Test
public void testGetUsuarioComCabecalho() throws Exception {
[Link](get("/usuarios/1")
.header("Authorization", "Bearer token"))
.andExpect(status().isOk());
}
12. Teste de Resposta com JSON
@Test
public void testUsuarioResponse() throws Exception {
[Link](get("/usuarios/1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.nome").value("João"))
.andExpect(jsonPath("$.id").value(1));
}
13. Teste de Exceção em Controlador
@Test
public void testUsuarioNaoEncontrado() throws Exception {
[Link](get("/usuarios/999"))
.andExpect(status().isNotFound());
}
14. Teste de Serviço com Condições
@Test
public void testBuscarUsuarioAtivo() {
Usuario usuario = new Usuario("João", true);
[Link](usuario);
List<Usuario> ativos = [Link]();
assertTrue([Link](usuario), "Deve conter o usuário ativo");
}
15. Teste de Vários Cenários com @Nested
import [Link];
@Nested
class QuandoUsuarioAtivo {
@Test
void testBuscarUsuarioAtivo() {
// Teste específico para usuário ativo
}
@Test
void testCadastrarUsuarioAtivo() {
// Teste específico para cadastrar usuário ativo
}
}
16. Teste de Conexão com o Banco de Dados
@Test
@Transactional
public void testUsuarioPersistidoNoBanco() {
Usuario usuario = new Usuario("Maria");
[Link](usuario);
assertNotNull([Link]("Maria"));
}
17. Teste de Implementação de Interface
public class UsuarioServiceImpl implements UsuarioService {
@Override
public void cadastrar(Usuario usuario) {
// Implementação do método
}
}
@Test
public void testCadastrarUsuarioImplementacao() {
UsuarioService usuarioService = new UsuarioServiceImpl();
Usuario usuario = new Usuario("Ana");
[Link](usuario);
// Verifica se o usuário foi cadastrado corretamente
}
18. Teste de Performance
@Test
public void testPerformanceCadastro() {
long startTime = [Link]();
for (int i = 0; i < 1000; i++) {
[Link](new Usuario("Usuario" + i));
}
long endTime = [Link]();
// Verifica se o tempo de execução é aceitável
assertTrue(endTime - startTime < 1000, "Cadastro deve ser rápido");
}
19. Teste de Segurança de Dados
@Test
public void testSegurancaDados() {
// Testa se os dados sensíveis estão criptografados
String senhaCriptografada = [Link]("minhaSenha");
assertNotEquals("minhaSenha", senhaCriptografada);
}
20. Teste de Validação de Dados de Entrada
@Test
public void testUsuarioNomeNaoVazio() {
Usuario usuario = new Usuario("");
// Verifica se a exceção é lançada ao tentar cadastrar um usuário com nome vazio
assertThrows([Link], () -> [Link](usuario));
}
21. Teste de Múltiplos Cenários com @MethodSource
@ParameterizedTest
@MethodSource("providesDadosParaTesteSoma")
void testSomaComDiferentesValores(int a, int b, int resultadoEsperado) {
assertEquals(resultadoEsperado, [Link](a, b));
}
static Stream<Arguments> providesDadosParaTesteSoma() {
return [Link](
[Link](1, 2, 3),
[Link](2, 3, 5),
[Link](5, 5, 10)
);
}
22. Teste de Manipulação de Exceções
@Test
public void testManipularExcecao() {
try {
[Link](null);
} catch (IllegalArgumentException e) {
// Verifica se a exceção é a esperada
assertEquals("Usuário não pode ser nulo", [Link]());
}
}
23. Teste de Estado de Objeto
@Test
public void testEstadoDoUsuario() {
Usuario usuario = new Usuario("Carlos", false);
[Link]();
assertTrue([Link](), "Usuário deve estar ativo após ativação");
}
24. Teste de Métodos Estáticos
@Test
public void testCalculoEstatistico() {
double resultado = [Link](new int[]{1, 2, 3, 4, 5});
assertEquals(3.0, resultado, "A média deve ser 3.0");
}
25. Teste de Inicialização de Configurações
import [Link];
public class ConfiguracaoTest {
@BeforeAll
static void inicializarConfiguracao() {
// Configurações globais antes de todos os testes
}
@Test
public void testConfiguracaoValida() {
assertTrue([Link](), "A configuração deve ser válida");
}
}
26. Teste de Resposta de API com MockRestServiceServer
@Autowired
private MockRestServiceServer server;
@Test
public void testChamadaApiExterna() {
[Link](requestTo("/api/external"))
.andRespond(withSuccess("{\"result\": \"success\"}", MediaType.APPLICATION_JSON));
String resposta = [Link]();
assertEquals("success", resposta);
}
27. Teste de Comportamento de Método
java
@Test
public void testComportamentoMetodo() {
Usuario usuario = new Usuario("Ana");
[Link](usuario);
verify(usuarioRepository, times(1)).save(usuario);
}
28. Teste de Reações a Mudanças de Estado
@Test
public void testReacaoMudancaEstado() {
Usuario usuario = new Usuario("Beatriz", false);
[Link]();
assertTrue([Link](), "Usuário deve estar ativo após ativação");
}
29. Teste de Segurança de Dados
@Test
public void testSegurancaDados() {
// Testa se os dados sensíveis estão criptografados
String senhaCriptografada = [Link]("minhaSenha");
assertNotEquals("minhaSenha", senhaCriptografada);
}
30. Teste de Integração com Múltiplas Dependências
@Test
public void testIntegracaoComServicosExternos() {
Usuario usuario = new Usuario("Fernando");
[Link](usuario);
// Verifica se o usuário foi cadastrado em um sistema externo
assertTrue([Link]([Link]()));
}
31. Teste de Validação de Emai
@Test
public void testEmailValido() {
String email = "usuario@[Link]";
assertTrue([Link](email), "O email deve ser válido");
}
32. Teste de Cache
@Test
public void testCacheUsuario() {
Usuario usuario = [Link](1L);
Usuario cachedUsuario = [Link](1L); // Deve usar o cache
assertSame(usuario, cachedUsuario, "Deve retornar o mesmo objeto do cache");
}
33. Teste de Mensagens de Erro
@Test
public void testMensagemErroQuandoUsuarioNaoEncontrado() {
Exception exception = assertThrows([Link], () -> {
[Link](999L);
});
assertEquals("Usuário não encontrado", [Link]());
}
34. Teste de Repositorio com Spring Data
@Test
public void testSalvarUsuario() {
Usuario usuario = new Usuario("Lucas");
[Link](usuario);
assertNotNull([Link](), "O ID do usuário não deve ser nulo após salvar");
}
35. Teste de Atualização de Usuário
@Test
public void testAtualizarUsuario() {
Usuario usuario = new Usuario("Gabriel");
[Link](usuario);
[Link]("Gabriel Atualizado");
[Link](usuario);
assertEquals("Gabriel Atualizado", [Link]([Link]()).getNome());
}
36. Teste de Exclusão de Usuário
@Test
public void testExcluirUsuario() {
Usuario usuario = new Usuario("Pedro");
[Link](usuario);
[Link]([Link]());
assertThrows([Link], () ->
[Link]([Link]()));
}
37. Teste de Dados Não Nulos
@Test
public void testDadosNaoNulos() {
Usuario usuario = new Usuario("Clara", null);
// Verifica se a exceção é lançada ao tentar cadastrar um usuário com dados nulos
assertThrows([Link], () -> [Link](usuario));
}
38. Teste de Resposta a Vários Usuários
@Test
public void testBuscarTodosUsuarios() {
List<Usuario> usuarios = [Link]();
assertFalse([Link](), "A lista de usuários não deve estar vazia");
}
39. Teste de Método Privado com Refletindo
@Test
public void testMetodoPrivado() throws Exception {
Method metodoPrivado = [Link]("metodoPrivado");
[Link](true);
String resultado = (String) [Link](usuarioService);
assertEquals("resultado esperado", resultado);
}
40. Teste de Validação com @Valid
@Test
public void testValidacaoUsuario() {
Usuario usuario = new Usuario("", "senha");
// Verifica se a exceção é lançada devido a falha na validação
assertThrows([Link], () ->
[Link](usuario));
}
41. Teste de Conexão a API com RestTemplate
@Test
public void testChamadaApiComRestTemplate() {
String response = [Link]("/api/external", [Link]);
assertNotNull(response, "A resposta da API não deve ser nula");
}
42. Teste de Ordenação
@Test
public void testOrdenacaoUsuarios() {
List<Usuario> usuarios = [Link]();
[Link]([Link](Usuario::getNome));
// Verifica se os usuários estão ordenados
assertEquals("Ana", [Link](0).getNome());
}
43. Teste de Filtragem
@Test
public void testFiltrarUsuariosAtivos() {
List<Usuario> ativos = [Link]();
for (Usuario usuario : ativos) {
assertTrue([Link](), "Todos os usuários devem estar ativos");
}
}
44. Teste de Lógica Complexa
@Test
public void testLogicaComplexa() {
// Implementa lógica complexa para o teste
boolean resultado = [Link]();
assertTrue(resultado, "A lógica complexa deve retornar verdadeiro");
}
45. Teste de Padrões de Projeto (Singleton)
@Test
public void testSingleton() {
UsuarioService instancia1 = [Link]();
UsuarioService instancia2 = [Link]();
assertSame(instancia1, instancia2, "As instâncias devem ser iguais");
}
46. Teste de Retorno de Código HTTP
@Test
public void testRetornoHttp() throws Exception {
[Link](get("/usuarios/1"))
.andExpect(status().isOk());
}
47. Teste de Propriedades de Configuração
@Test
public void testPropriedadesConfiguracao() {
String valor = [Link]("[Link]");
assertEquals("valorEsperado", valor, "A propriedade deve ter o valor esperado");
}
48. Teste de Injeção de Dependência
@Autowired
private UsuarioService usuarioService;
@Test
public void testInjecaoDependencia() {
assertNotNull(usuarioService, "O serviço não deve ser nulo");
}
49. Teste de Componentes com @ComponentTest
@Test
@ComponentTest
public void testComponente() {
assertTrue([Link](), "O componente deve estar ativo");
}
50. Teste de API com MockMvc e @AutoConfigureMockMvc
@Test
@AutoConfigureMockMvc
public void testApiUsuarios() throws Exception {
[Link](get("/api/usuarios"))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON));
}
Conclusão
A utilização do JUnit em conjunto com boas práticas de teste é fundamental para
garantir a qualidade e a manutenibilidade do código em projetos Java,
especialmente em ambientes corporativos. Este artigo apresentou uma
variedade de exemplos que abrangem desde testes simples de lógica até
integrações complexas com bancos de dados e APIs. A implementação de testes
não é apenas uma prática recomendada, mas uma necessidade para o
desenvolvimento de software robusto.
Referências
• Documentação Oficial do JUnit 5
• Spring Boot Testing
• Mockito Documentation
• Java API Documentation
• Java Persistence API (JPA)
EducaCiência FastCode para a comunidade.