java单元测试不能直接触发拦截器和过滤器的完整执行链,需通过mockhttpservletrequest/mockhttpservletresponse模拟请求响应、自定义filterchain测试过滤器,或用mockmvc+handlermethod手动调用拦截器方法验证逻辑。

Java 单元测试本身不能直接触发拦截器(Interceptor)和过滤器(Filter)的完整执行链,因为它们依赖于 Servlet 容器(Filter)或 Spring MVC 的 DispatcherServlet 生命周期(Interceptor)。但可以通过针对性策略完成有效验证——重点不是“启动容器跑一遍”,而是隔离逻辑、模拟上下文、验证行为。
测试过滤器:用 MockHttpServletRequest/MockHttpServletResponse + FilterChain
过滤器核心是 doFilter() 方法。只要不依赖容器内部状态(如 FilterConfig 初始化参数中的特殊资源),就能脱离 Tomcat 独立测试。
- 使用 Spring Test 提供的
MockHttpServletRequest和MockHttpServletResponse构造请求/响应对象 - 创建一个轻量
FilterChain实现(比如匿名类或自定义 MockFilterChain),只做“记录是否被放行”或“检查响应状态” - 在
doFilter()调用前后断言:请求头是否被修改、响应状态码是否设为 403、日志是否写入等 - 示例场景:测试字符编码过滤器是否设置了
request.setCharacterEncoding("UTF-8")和response.setCharacterEncoding("UTF-8")
测试拦截器:用 MockMvc + 自定义 HandlerMethod + 模拟 Spring 上下文
拦截器运行在 Spring MVC 流程中,preHandle/postHandle/afterCompletion 三个方法需配合请求上下文调用。推荐用 MockMvc 驱动端到端风格测试,但更高效的是单元级调用:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 构造
MockHttpServletRequest、MockHttpServletResponse、HandlerMethod(可 mock 一个空 Controller 方法) - 手动调用
interceptor.preHandle(request, response, handler),验证返回值(true/false)、重定向是否设置、session 是否被读取等 - 对
postHandle,需先准备好ModelAndView对象再传入;对afterCompletion,可传入null异常来覆盖正常/异常路径 - 若拦截器依赖
@Autowired的 service,可用@MockBean或ReflectionTestUtils.setField()注入 mock 实例
不建议但偶尔可行:集成测试走 MockMvc 全链路
当拦截器或过滤器逻辑复杂、与 Spring Bean 深度耦合(如权限校验调用了 UserDetailsService),且你希望验证真实调用顺序时,可用 @WebMvcTest 启动最小 Web 上下文:
- 用
@WebMvcTest(controllers = YourController.class)加载配置好的拦截器 - 用
mockMvc.perform(get("/api/data"))发起请求,通过.andExpect(status().isOk())或.andDo(print())观察行为 - 注意:过滤器默认不会被
@WebMvcTest加载,需显式添加@Import({YourFilter.class})或改用@SpringBootTest(webEnvironment = RANDOM_PORT) - 这种测试属于轻量集成测试,速度比纯单元测试慢,应作为补充而非主力
关键提醒:避免测试“容器行为”,专注“你的代码”
不要试图验证 “Filter 是否在 Servlet 前执行” 或 “Interceptor 是否在 Controller 后执行”——那是框架保证的。你应该验证:
- 你的过滤器是否正确识别了非法请求并中断链(没调用
chain.doFilter()) - 你的拦截器
preHandle在未登录时是否重定向到 /login 并返回 false - 你的
afterCompletion是否在异常发生后仍执行了日志记录 - 所有外部依赖(如 Redis、DB)都必须 mock,否则就不是单元测试
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










