如何在MockMvc测试中禁用Interceptor以测试RestController异常场景
如何在Spring MVC测试中禁用Interceptor
刚好碰到过类似的问题——用MockMvc测试ControllerAdvice的异常状态码映射时,拦截器总是提前触发,导致没法验证预期结果。这里给你几个实用的方法,帮你在测试中跳过拦截器:
方法1:用standaloneSetup替代webAppContextSetup
webAppContextSetup会加载整个Spring上下文,自然也会包含所有注册的拦截器;而standaloneSetup可以单独初始化目标控制器,手动控制要加载的组件,完全绕开拦截器的触发。
示例代码:
@Autowired private YourRestController yourRestController; // 直接注入你的目标控制器 @Autowired private YourControllerAdvice exceptionHandler; // 注入需要验证的ControllerAdvice @Before public void setup() { mockMvc = MockMvcBuilders.standaloneSetup(yourRestController) .setControllerAdvice(exceptionHandler) // 手动添加需要生效的ControllerAdvice // 不添加任何interceptor配置,拦截器就不会被触发 .build(); }
这种方式的优势是测试更轻量化,隔离性更好,完全掌控测试环境,不会引入无关组件干扰结果。
方法2:在测试中排除拦截器的配置类
如果你的拦截器是通过实现WebMvcConfigurer的配置类注册的,可以在测试类中替换或排除这个配置类:
方式A:用@MockBean替代拦截器配置
@SpringBootTest @AutoConfigureMockMvc public class YourControllerTest { @MockBean private YourInterceptorConfig interceptorConfig; // 你的拦截器注册配置类 @Autowired private MockMvc mockMvc; // 你的测试方法... }
Spring会用Mock对象替代真实的配置类,拦截器自然不会被注册到上下文里。
方式B:自定义测试配置覆盖原有配置
@SpringBootTest @AutoConfigureMockMvc public class YourControllerTest { @TestConfiguration static class TestConfig implements WebMvcConfigurer { // 不重写addInterceptors方法,就不会注册任何拦截器 } @Autowired private MockMvc mockMvc; // 你的测试方法... }
通过自定义的测试配置覆盖原有的WebMvc配置,跳过拦截器的注册逻辑。
方法3:动态移除已注册的拦截器
如果必须使用webAppContextSetup加载完整上下文,可以手动从上下文里移除拦截器:
@Autowired private WebApplicationContext webApplicationContext; @Before public void setup() { // 获取RequestMappingHandlerMapping,它持有所有拦截器 RequestMappingHandlerMapping mapping = webApplicationContext.getBean(RequestMappingHandlerMapping.class); // 清空拦截器列表 mapping.setInterceptors(new Object[0]); mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); }
这种方式适合需要保留大部分上下文,只移除特定拦截器的场景。
推荐优先尝试standaloneSetup的方案,它的测试隔离性和灵活性都更适合这类聚焦于控制器异常处理的测试。
内容的提问来源于stack exchange,提问作者Jayashree Madanala
相关产品推荐
相关产品推荐

