O que unit-test-exception-handler faz?
Fornece padrões para testes unitários de @ExceptionHandler e @ControllerAdvice em aplicações Spring Boot. Valida a formatação de respostas de erro, simula exceções, verifica códigos de status HTTP, testa erros de validação em nível de campo e valida payloads de erro personalizados. Use ao escrever testes de manipuladores de exceção Spring, testes de erro de API REST ou ao simular conselhos de controladores.
Exemplo de Uso
@ExtendWith(MockitoExtension.class)
class GlobalExceptionHandlerTest {
@InjectMocks
private GlobalExceptionHandler handler;
@Mock
private HttpServletRequest request;
@Test
void testResourceNotFound() {
// Simula uma exceção
ResourceNotFoundException ex = new ResourceNotFoundException("Usuário não encontrado");
// Executa o manipulador
ResponseEntity<ErrorResponse> response = handler.handleResourceNotFound(ex, request);
// Verifica o status HTTP
assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode());
// Verifica o payload de erro
ErrorResponse body = response.getBody();
assertNotNull(body);
assertEquals("Usuário não encontrado", body.getMessage());
assertEquals(404, body.getStatus());
}
@Test
void testValidationError() {
// Simula um erro de validação
MethodArgumentNotValidException ex = mock(MethodArgumentNotValidException.class);
BindingResult bindingResult = mock(BindingResult.class);
List<FieldError> fieldErrors = List.of(
new FieldError("objeto", "campo", "valor", false, null, null, "Campo obrigatório")
);
when(bindingResult.getFieldErrors()).thenReturn(fieldErrors);
when(ex.getBindingResult()).thenReturn(bindingResult);
// Executa o manipulador
ResponseEntity<ErrorResponse> response = handler.handleValidationException(ex, request);
// Verifica o status HTTP
assertEquals(HttpStatus.BAD_REQUEST, response.getStatusCode());
// Verifica os erros de validação
ErrorResponse body = response.getBody();
assertNotNull(body);
assertTrue(body.getErrors().contains("campo: Campo obrigatório"));
}
@Test
void testCustomErrorPayload() {
// Cria uma exceção personalizada com campos adicionais
CustomBusinessException ex = new CustomBusinessException("Erro de negócio", "ERR-001");
// Executa o manipulador
ResponseEntity<CustomErrorResponse> response = handler.handleCustomException(ex, request);
// Verifica campos personalizados
CustomErrorResponse body = response.getBody();
assertNotNull(body);
assertEquals("Erro de negócio", body.getMessage());
assertEquals("ERR-001", body.getErrorCode());
}
}
Dicas
- Use
Mockitopara simular dependências do manipulador de exceção. - Teste diferentes cenários de erro: erros de cliente (4xx) e erros de servidor (5xx).
- Verifique não apenas o código HTTP, mas também a estrutura e conteúdo da resposta.
- Para validações de campo, garanta que todos os erros esperados sejam retornados.
Compatibilidade
- Spring Boot 2.x e 3.x
- JUnit 5
- Mockito 4+