Spring Boot集成测试中使用TestRestTemplate时禁用过滤器
禁用Token验证Filter的几种实用方案
方案一:用@MockBean替换目标Filter
直接在测试类中给你的Token验证Filter添加@MockBean注解,Spring会自动将容器内的真实Filter替换为Mock实例,请求时不会执行任何验证逻辑:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class YourIntegrationTest { @Autowired private TestRestTemplate restTemplate; // 替换你的Token验证Filter类 @MockBean private TokenValidationFilter tokenValidationFilter; // 测试方法示例 @Test public void testWithoutToken() { ResponseEntity<String> response = restTemplate.getForEntity("/your-api-path", String.class); // 断言逻辑... } }
方案二:给Filter加环境标记,测试时不加载
在你的Filter类上添加@Profile注解,指定仅在非测试环境生效:
@Component @Order(1) @Profile("!test") public class TokenValidationFilter implements Filter { // 原有token验证逻辑... }
然后在测试类中激活test环境:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @ActiveProfiles("test") public class YourIntegrationTest { @Autowired private TestRestTemplate restTemplate; // 测试方法... }
方案三:自定义测试配置,禁用目标Filter的注册
创建测试专用配置类,手动关闭目标Filter的注册开关:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @Import(TestFilterConfig.class) public class YourIntegrationTest { @Autowired private TestRestTemplate restTemplate; // 测试方法... } @TestConfiguration public class TestFilterConfig { @Bean public FilterRegistrationBean<TokenValidationFilter> disableTokenFilter(TokenValidationFilter filter) { FilterRegistrationBean<TokenValidationFilter> registration = new FilterRegistrationBean<>(filter); registration.setEnabled(false); // 禁用该Filter return registration; } }
方案四:临时添加假Token(无需改动Filter)
如果不想调整Filter或配置,可以给TestRestTemplate加个拦截器,自动注入能通过验证的假Token,省去手动生成的麻烦:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class YourIntegrationTest { private TestRestTemplate restTemplate; @Autowired public void initRestTemplate(TestRestTemplate template) { RestTemplate coreTemplate = template.getRestTemplate(); coreTemplate.getInterceptors().add((request, body, execution) -> { // 注入假的Token头,适配你的Filter验证规则 request.getHeaders().add("Authorization", "Bearer fake-valid-token"); return execution.execute(request, body); }); this.restTemplate = new TestRestTemplate(coreTemplate); } // 测试方法... }
内容的提问来源于stack exchange,提问作者Sankalp
相关产品推荐
相关产品推荐

