在 Java 里,“拦截器”通常指 Spring 的 HandlerInterceptor 或 Spring MVC 拦截器,也可能指 MyBatis 拦截器 / Dubbo 拦截器 / Servlet Filter 等。下面我以最常见的 Spring MVC 拦截器(HandlerInterceptor)为例,系统讲一下如何测试。
@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/**");
}
}
@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());
}
}
✅ 优点
@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);
}
}
如果你只测拦截器逻辑,可以直接 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);
}
✅ 优点
@Test
void testMyBatisInterceptor() {
Interceptor interceptor = new MyInterceptor();
// 使用 Plugin.wrap 或 Configuration 测试
}
一般通过 SQL 执行前后行为验证。
| 场景 | 推荐方式 |
|---|---|
| 验证拦截规则 | @WebMvcTest |
| 验证完整链路 | @SpringBootTest |
| 只测逻辑 | Mockito 单元测试 |
| 性能/异常 | 集成测试 |
如果你指的是 某一种具体拦截器(如 MyBatis / Dubbo / Sentinel / Spring Security),可以告诉我,我可以给你对应的测试模板。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。