温馨提示×

温馨提示×

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

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

如何测试java拦截器

发布时间:2026-09-18 20:44:03 来源:亿速云 阅读:105 作者:小樊 栏目:编程语言

在 Java 里,“拦截器”通常指 Spring 的 HandlerInterceptor 或 Spring MVC 拦截器,也可能指 MyBatis 拦截器 / Dubbo 拦截器 / Servlet Filter 等。下面我以最常见的 Spring MVC 拦截器(HandlerInterceptor)为例,系统讲一下如何测试。


一、Spring MVC 拦截器示例

@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;
    }
}

注册:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private LoginInterceptor loginInterceptor;

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

二、测试方式一:集成测试(推荐)

1️⃣ 使用 @WebMvcTest + MockMvc

@WebMvcTest
@Import(LoginInterceptor.class)
class LoginInterceptorTest {

    @Autowired
    MockMvc mockMvc;

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

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

✅ 优点

  • 真实走 Spring MVC 拦截链
  • 接近线上行为

2️⃣ 使用 @SpringBootTest + TestRestTemplate

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class InterceptorIntegrationTest {

    @Autowired
    TestRestTemplate restTemplate;

    @Test
    void testInterceptor() {
        ResponseEntity<String> resp =
            restTemplate.getForEntity("/api/user", String.class);
        assertThat(resp.getStatusCode().value()).isEqualTo(401);
    }
}

三、测试方式二:单元测试(不依赖 Spring)

如果你只测拦截器逻辑,可以直接 mock:

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

    HttpServletRequest request = mock(HttpServletRequest.class);
    HttpServletResponse response = mock(HttpServletResponse.class);

    when(request.getHeader("token")).thenReturn(null);

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

    assertFalse(result);
    verify(response).setStatus(401);
}

✅ 优点

  • 快
  • 不启动 Spring

四、测试 MyBatis 拦截器(补充)

@Test
void testMyBatisInterceptor() {
    Interceptor interceptor = new MyInterceptor();
    // 使用 Plugin.wrap 或 Configuration 测试
}

一般通过 SQL 执行前后行为验证。


五、测试建议总结

场景 推荐方式
验证拦截规则 @WebMvcTest
验证完整链路 @SpringBootTest
只测逻辑 Mockito 单元测试
性能/异常 集成测试

如果你指的是 某一种具体拦截器(如 MyBatis / Dubbo / Sentinel / Spring Security),可以告诉我,我可以给你对应的测试模板。

向AI问一下细节

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

AI
助
手