You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何@ExceptionHandler在JUnit测试中无法生效?

Spring Boot控制器@ExceptionHandler注解JUnit测试异常未捕获问题解决

问题场景

  • 最初控制器通过try/catch块手动处理异常,直接调用控制器方法的JUnit测试能正常运行
  • 为消除代码重复,改用@ExceptionHandler注解统一处理全局异常,应用启动后实际请求能正常返回500响应
  • 但JUnit测试中直接调用控制器方法时,抛出的RuntimeException未被@ExceptionHandler捕获,直接导致测试报错,尝试Mock仓库返回异常也无法解决问题

问题原因

@ExceptionHandler是Spring MVC框架提供的异常处理机制,它的生效依赖于Spring MVC的完整请求处理流程——只有当请求通过DispatcherServlet分发处理时,Spring才会识别并触发@ExceptionHandler注解的方法。如果直接在测试中调用控制器的方法,本质上就是普通的Java方法调用,不会触发Spring的异常处理上下文,所以异常无法被捕获。

解决方法

改用MockMvc模拟真实的HTTP请求来测试控制器,这样请求会完整经过Spring MVC的处理流程,@ExceptionHandler就能正常捕获并处理异常。示例代码如下:

@WebMvcTest(YourTargetController.class)
public class YourTargetControllerTest {
    @Autowired
    private MockMvc mockMvc;

    @Test
    public void testExceptionHandlerTrigger() throws Exception {
        mockMvc.perform(get("/your-test-endpoint"))
               .andExpect(status().isInternalServerError())
               .andExpect(content().string(containsString("预期的异常提示")));
    }
}

内容的提问来源于stack exchange,提问作者Enialix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 02:52:03