unit-test-exception-handler
Provides patterns for unit testing `@ExceptionHandler` and `@ControllerAdvice` in Spring Boot applications. Validates error response formatting, mocks exceptions, verifies HTTP status codes, tests field-level validation errors, and asserts custom error payloads
Install / Use
npx skills add giuseppe-trisciuoglio/developer-kit --skill unit-test-exception-handlerInstalls into whichever agent you are using.
SKILL.md
Installable skill definition
Quality Score
Category
Content & MediaSupported Platforms
Our assessment of unit-test-exception-handler
unit-test-exception-handler scores 83/100 on our quality scale, 908th of 1,192 Content & Media skills we index.
Its SKILL.md is 6.1 KB long, well organised into 10 sections with 2 code examples: a thorough specification that gives an agent plenty to work with.
It has 353 GitHub stars, a meaningful sign that others use it.
Maintenance, license and trust
- The repository was last updated 26 days ago, so unit-test-exception-handler is actively maintained.
- It is released under the MIT license, a permissive license that allows use, modification and commercial use with attribution.
- Its trust signals score 100/100, with no cautions. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.
unit-test-exception-handler compared with similar skills
All 4 of these similar skills score higher than unit-test-exception-handler; compare them before choosing.
| Skill | Score | Stars | Updated | Format |
|---|---|---|---|---|
| unit-test-exception-handler (this skill)by giuseppe-trisciuoglio | 83 | 353 | 26d ago | SKILL.md |
| Agent-Reachby Panniantong | 100 | 92.6k | 21d ago | CLAUDE.md |
| headroomby headroomlabs-ai | 100 | 74.5k | today | CLAUDE.md |
| Scraplingby D4Vinci | 100 | 86.0k | today | MCP Server |
| crawl4aiby unclecode | 100 | 84.8k | 1d ago | MCP Server |
Frequently asked questions
- How do I install unit-test-exception-handler?
- Run
npx skills add giuseppe-trisciuoglio/developer-kit --skill unit-test-exception-handler. The install tabs above show the steps for each supported agent. - Which AI agents does unit-test-exception-handler work with?
- It is written for Universal, as a SKILL.md file. Other agents that read the same format can often use it too.
- Is unit-test-exception-handler safe to use?
- It is MIT-licensed and scores 100/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
- Is unit-test-exception-handler still maintained?
- The repository was last updated 26 days ago, so unit-test-exception-handler is actively maintained.
Skill content
View source on GitHubname: unit-test-exception-handler
description: Provides patterns for unit testing @ExceptionHandler and @ControllerAdvice in Spring Boot applications. Validates error response formatting, mocks exceptions, verifies HTTP status codes, tests field-level validation errors, and asserts custom error payloads. Use when writing Spring exception handler tests, REST API error tests, or mocking controller advice.
allowed-tools: Read, Write, Bash, Glob, Grep
Unit Testing ExceptionHandler and ControllerAdvice
Overview
This skill provides patterns for writing unit tests for Spring Boot exception handlers. It covers testing @ExceptionHandler methods in @ControllerAdvice classes using MockMvc, including HTTP status assertions, JSON response validation, field-level validation error testing, and mocking handler dependencies.
When to Use
- Writing unit tests for
@ExceptionHandlermethods - Testing
@ControllerAdviceglobal exception handling - Validating REST API error response formatting
- Mocking exceptions in controller tests
- Testing field-level validation error responses
- Asserting custom error payloads and HTTP status codes
Instructions
- Create a test controller that throws specific exceptions to trigger each
@ExceptionHandler - Register ControllerAdvice via
setControllerAdvice()onMockMvcBuilders.standaloneSetup() - Assert HTTP status codes with
.andExpect(status().isXxx()) - Verify error response fields using
jsonPath("$.field")matchers - Test validation errors by sending invalid payloads and checking
MethodArgumentNotValidExceptionproduces field-level details - Debug failures with
.andDo(print())— if handler not invoked, verifysetControllerAdvice()is called and exception type matches
Examples
Exception Handler and Error DTO
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public ErrorResponse handleNotFound(ResourceNotFoundException ex) {
return new ErrorResponse(404, "Not Found", ex.getMessage());
}
@ExceptionHandler(ValidationException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ErrorResponse handleValidation(ValidationException ex) {
return new ErrorResponse(400, "Bad Request", ex.getMessage());
}
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ValidationErrorResponse handleMethodArgumentNotValid(MethodArgumentNotValidException ex) {
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getFieldErrors().forEach(e -> errors.put(e.getField(), e.getDefaultMessage()));
return new ValidationErrorResponse(400, "Validation Failed", errors);
}
}
public record ErrorResponse(int status, String error, String message) {}
public record ValidationErrorResponse(int status, String error, Map<String, String> errors) {}
Unit Test
@ExtendWith(MockitoExtension.class)
class GlobalExceptionHandlerTest {
private MockMvc mockMvc;
@BeforeEach
void setUp() {
GlobalExceptionHandler handler = new GlobalExceptionHandler();
mockMvc = MockMvcBuilders.standaloneSetup(new TestController())
.setControllerAdvice(handler)
.build();
}
@Test
void shouldReturn404WhenResourceNotFound() throws Exception {
mockMvc.perform(get("/api/users/999"))
.andExpect(status().isNotFound())
.andExpect(jsonPath("$.status").value(404))
.andExpect(jsonPath("$.error").value("Not Found"))
.andExpect(jsonPath("$.message").value("User not found"));
}
@Test
void shouldReturn400WithFieldErrorsOnValidationFailure() throws Exception {
mockMvc.perform(post("/api/users")
.contentType("application/json")
.content("{\"name\":\"\",\"email\":\"invalid\"}"))
.andExpect(status().isBadRequest())
.andExpect(jsonPath("$.status").value(400))
.andExpect(jsonPath("$.errors.name").value("must not be blank"))
.andExpect(jsonPath("$.errors.email").value("must be a valid email"));
}
}
@RestController
@RequestMapping("/api")
class TestController {
@GetMapping("/users/{id}") public User getUser(@PathVariable Long id) {
throw new ResourceNotFoundException("User not found");
}
@PostMapping("/users") public User createUser(@RequestBody @Valid User user) {
throw new ValidationException("Validation failed");
}
}
Best Practices
- Test each
@ExceptionHandlermethod independently with a dedicated exception throw - Register exactly one
@ControllerAdviceinstance viasetControllerAdvice()— never skip it - Assert all fields in the error response body, not just the HTTP status
- For validation errors, verify both the field name key and the error message value
- Use
MockMvcBuilders.standaloneSetup()for isolated handler tests without full Spring context - Log assertion failures: chain
.andDo(print())to print request/response when a test fails
Common Pitfalls
- Handler not invoked: ensure
setControllerAdvice()is called on the builder - JsonPath mismatch: use
.andDo(print())to inspect actual response structure - Status is 200: missing
@ResponseStatuson the handler method - Duplicate handlers:
@Ordercontrols precedence; more specific exception types take priority - Testing handler logic instead of behavior: mock external dependencies, test only the response transformation
Constraints and Warnings
@ExceptionHandlerspecificity: more specific exception types are matched first;Exception.classcatches all unmatched types@ResponseStatusdefault: without@ResponseStatusor returningResponseEntity, HTTP status defaults to 200- Global vs local scope:
@ExceptionHandlerin@ControllerAdviceis global; declared in a controller it is local only to that controller - Logging side effects: handlers that log should be verified with
verify(mockLogger).logXxx(...) - Localization: when using
MessageSource, test with differentLocalevalues to confirm message resolution - Security context:
AuthorizationExceptionhandlers can accessSecurityContextHolder— test that context is correctly evaluated
Related Skills
Agent-Reach
92.6kGive your AI agent eyes to see the entire internet. Read & search Twitter, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu — one CLI, zero API fees.
headroom
74.5kCompress tool outputs, logs, files, and RAG chunks before they reach the LLM. 20% fewer tokens for coding agents, 60-95% fewer tokens for JSON, same answers. Library, proxy, MCP server.
Scrapling
86.0k🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl! Don't be shy, join here: https://discord.gg/EMgGbDceNQ and follow here for daily tips and tricks: https://x.com/Scrapling_dev
crawl4ai
84.8kOpen-source web crawler and scraper for LLMs and AI agents: any website into clean, LLM-ready Markdown. Run it yourself, or use Crawl4AI Cloud with one key.
Languages
Trust signals
From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.
