温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎样测试java拦截器

发布时间:2026-10-08 03:05:08 来源:亿速云 阅读:83 作者:小樊 栏目:编程语言

在 Java 里,“拦截器”通常指 Servlet Filter、Spring Interceptor、MyBatis Interceptor、Dubbo Filter 等。下面以**最常见、最容易被问到的 Spring 拦截器(HandlerInterceptor)**为主,顺便补充 Filter 和单元测试方法。


一、先明确你用的是哪种“拦截器”

类型 典型场景 测试重点
Servlet Filter 请求最外层(字符集、日志、鉴权) 请求/响应是否被正确处理
Spring HandlerInterceptor Controller 前后 登录校验、权限、日志
MyBatis Interceptor SQL 执行前后 SQL 改写、分页
Dubbo Filter RPC 调用 链路追踪、限流

二、Spring 拦截器(HandlerInterceptor)怎么测

1️⃣ 写一个拦截器

@Component
public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) {
        String token = request.getHeader("token");
        if (token == null) {
            response.setStatus(401);
            return false;
        }
        return true;
    }
}

2️⃣ 注册拦截器

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**");
    }
}

三、测试方式一:集成测试(最推荐 ✅)

使用 Spring Boot Test + MockMvc

@SpringBootTest
@AutoConfigureMockMvc
class LoginInterceptorTest {

    @Autowired
    MockMvc mockMvc;

    @Test
    void shouldRejectWhenNoToken() throws Exception {
        mockMvc.perform(get("/user/info"))
               .andExpect(status().isUnauthorized());
    }

    @Test
    void shouldPassWithToken() throws Exception {
        mockMvc.perform(get("/user/info")
                        .header("token", "abc"))
               .andExpect(status().isOk());
    }
}

✅ 优点

  • 真实走拦截器链
  • 接近生产环境

四、测试方式二:单元测试(不启动 Spring)

直接测拦截器逻辑

class LoginInterceptorUnitTest {

    @Test
    void preHandle_shouldReturnFalseWhenNoToken() throws Exception {
        LoginInterceptor interceptor = new LoginInterceptor();

        MockHttpServletRequest request = new MockHttpServletRequest();
        MockHttpServletResponse response = new MockHttpServletResponse();

        boolean result = interceptor.preHandle(
                request, response, new Object());

        assertFalse(result);
        assertEquals(401, response.getStatus());
    }
}

✅ 优点

  • 快
  • 不依赖 Spring

五、Servlet Filter 怎么测

@WebFilter("/*")
public class LogFilter implements Filter {
    public void doFilter(...) {
        // 日志逻辑
        chain.doFilter(request, response);
    }
}

测试

mockMvc.perform(get("/test"))
       .andExpect(status().isOk());

或用 MockFilterChain 单元测试。


六、MyBatis 拦截器测试

@Intercepts({@Signature(type = Executor.class,
        method = "update", args = {MappedStatement.class, Object.class})})
public class SqlInterceptor implements Interceptor {
}

✅ 测试方式

  • 启动嵌入式数据库(H2)
  • 执行 Mapper 方法
  • 验证 SQL 是否被拦截/改写

七、常见测试点总结 ✅

  • 是否正确拦截请求
  • 是否放行合法请求
  • 是否修改 request / response
  • 是否抛出异常
  • 是否影响性能(压测)

如果你能告诉我:

  • 用的是 Spring / Spring Boot / Servlet / MyBatis / Dubbo
  • 拦截器是 鉴权 / 日志 / 参数处理

我可以直接给你对应可运行的测试代码示例。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手