spring boot全局异常处理器单元测试应使用@webmvctest+mockmvc,验证异常捕获、json响应结构(状态码/code/message)、日志记录及视图跳转,避免@springboottest或手动实例化。

Spring Boot 全局异常处理器的单元测试,核心是验证它能否正确捕获指定异常、返回预期格式(如 JSON 或视图),并包含关键信息(如错误码、提示语、日志记录等)。不依赖完整启动,用 MockMvc + @WebMvcTest 最轻量、最推荐。
用 @WebMvcTest 测试 REST 异常处理器
适用于前后端分离场景(@RestControllerAdvice),重点验证 JSON 响应结构和状态码。
- 在测试类上加 @WebMvcTest(GlobalExceptionHandler.class),只加载 Web 层和该异常处理器,不启动整个容器
- 注入 MockMvc,用于模拟 HTTP 请求
- 编写一个会抛出目标异常的测试 Controller(或直接 mock 抛出)
- 发起请求后,检查响应状态码(如 500)、Content-Type(application/json)、以及 JSON 字段(code/message)是否符合预期
示例代码片段:
@WebMvcTest(GlobalExceptionHandler.class)
class GlobalExceptionHandlerTest {
@Autowired
private MockMvc mockMvc;
@Test
void shouldReturnErrorJsonWhenBusinessExceptionOccurs() throws Exception {
mockMvc.perform(get("/api/test-exception"))
.andExpect(status().isInternalServerError())
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andExpect(jsonPath("$.code").value("500"))
.andExpect(jsonPath("$.message").value("业务异常,请联系管理员"));
}
}
测试带日志记录的异常处理器
如果处理器里调用了 log.error(...),可使用 LogCaptor(第三方库)捕获日志内容进行断言。
- 添加依赖:
<dependency><groupid>net.kemitix</groupid><artifactid>logcaptor</artifactid><scope>test</scope></dependency> - 在测试方法中创建
LogCaptor.forClass(GlobalExceptionHandler.class) - 触发异常后,断言日志中是否包含关键字符串(如“系统异常”、“堆栈”)
测试传统 MVC 视图异常处理器
适用于返回 HTML 页面的 @ControllerAdvice + HandlerExceptionResolver 实现。
- 仍用 @WebMvcTest,但需配置 Thymeleaf 或 FreeMarker 模板引擎(或仅验证 ModelAndView 结构)
- 检查返回的 ModelAndView 对象:viewName 是否为 "error",model 中是否包含 "exception" 和 "url"
- 若要渲染页面,可配合 @AutoConfigureTestDatabase 和内嵌模板引擎做集成验证
补充:避免常见误区
- 不要用 @SpringBootTest 启动全应用测异常处理器——太重、慢、耦合高
- 不要在测试中手动 new 异常处理器实例再调用方法——绕过了 Spring 的 AOP 和注解增强逻辑
- 确保测试异常类型与 @ExceptionHandler 声明的类型严格匹配(含继承关系)
- 参数校验异常(如
MethodArgumentNotValidException)需构造含校验注解的 DTO 并发送非法 JSON 才能触发











