研发协作
用 MockMvc standaloneSetup…
在编写 Spring Boot REST API 异常处理器单元测试时,验证错误响应格式、HTTP 状态码与字段级校验错误。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
用 MockMvc standalone通用
解决思路
- 创建一个测试控制器,抛出特定异常以触发每个 @ExceptionHandler
- 通过 MockMvcBuilders.standaloneSetup() 上的 setControllerAdvice() 注册 ControllerAdvice
- 用 .andExpect(status().isXxx()) 断言 HTTP 状态码
- 用 jsonPath("$.field") 匹配器验证错误响应字段
- 测试校验错误:发送非法 payload,检查 MethodArgumentNotValidException 是否产生字段级详情
- 用 .andDo(print()) 调试失败——若 handler 未被调用,确认已调用 setControllerAdvice() 且异常类型匹配
- 每个 @ExceptionHandler 方法用专门的异常抛出独立测试
- 通过 setControllerAdvice() 只注册一个 @ControllerAdvice 实例,绝不跳过
- 断言错误响应体中的所有字段,而不仅是 HTTP 状态码
- 对校验错误,同时验证字段名 key 和错误消息 value
- 使用 MockMvcBuilders.standaloneSetup() 做隔离的 handler 测试,无需完整 Spring 上下文
- 在断言失败时链式调用 .andDo(print()) 打印请求/响应
- 注意 @ExceptionHandler 特异性:更具体的异常类型优先匹配,Exception.class 捕获所有未匹配类型
- 注意 @ResponseStatus 默认值:没有 @ResponseStatus 或返回 ResponseEntity 时,HTTP 状态默认为 200
- 区分全局与局部作用域:@ControllerAdvice 中的 @ExceptionHandler 是全局的,控制器中声明的仅对该控制器局部有效
- 对会记录日志的 handler,用 verify(mockLogger).logXxx(...) 验证日志副作用
- 使用 MessageSource 时,用不同 Locale 值测试以确认消息解析
- 对 AuthorizationException handler,测试其能否正确访问 SecurityContextHolder 并评估上下文
适用边界 · 注意事项
- 需要完整 Spring 上下文或集成测试时,standaloneSetup 不适用
- 测试 handler 内部业务逻辑而非响应转换行为时(应 mock 外部依赖,只测响应转换)