Spring Security 6 JWT集成测试报错:缺失HandlerMappingIntrospector
解决方案
问题根源
你的测试仅加载了自定义安全配置类,未初始化完整的Spring MVC上下文,导致缺失HandlerMappingIntrospector;同时由于未触发Okta Starter的自动配置逻辑,jwtDecoder Bean也无法被创建。
方案1:使用@WebMvcTest切片测试(推荐)
该注解专为控制器层测试设计,会自动配置Spring MVC核心组件(包括HandlerMappingIntrospector),且仅加载指定控制器类,不会引入服务层Bean,完全匹配你的需求。
修改测试类如下:
@WebMvcTest(controllers = [目标控制器类::class]) // 指定要测试的控制器,避免冗余Bean加载 @Import(CustomSecurityConfig::class) // 导入自定义安全配置,确保权限规则生效 class SecuritySetupTest { @Autowired private lateinit var mvc: MockMvc @Test fun contextLoads() { assertTrue { true } } // 示例:验证swagger端点允许匿名访问 @Test fun swaggerEndpointPermitted() { mvc.perform(get("/v3/api-docs")) .andExpect(status().isOk) } // 示例:验证受保护端点需要认证 @Test fun protectedEndpointRequiresAuth() { mvc.perform(get("/your-protected-path")) .andExpect(status().isUnauthorized) } }
关键说明:
@WebMvcTest自动完成Spring MVC基础环境搭建,无需手动配置HandlerMappingIntrospector。- Okta Starter的自动配置逻辑会被测试框架触发,自动创建
jwtDecoderBean,无需手动Mock或定义。 - 若需测试认证后的请求,可使用Spring Security提供的
jwt()请求处理器模拟合法令牌:@Test fun protectedEndpointAccessibleWithValidJwt() { mvc.perform(get("/your-protected-path") .with(jwt().jwt { it.claim("scope", "required-scope") })) .andExpect(status().isOk) }
方案2:保留原有测试结构的兼容配置(不推荐)
如果必须使用@ContextConfiguration,需手动导入Spring MVC基础配置和Okta的自动配置类,补全缺失的Bean:
@ExtendWith(SpringExtension::class) @ContextConfiguration(classes = [ CustomSecurityConfig::class, WebMvcConfigurer::class, // 初始化Spring MVC核心组件 OktaOAuth2ResourceServerAutoConfiguration::class // 触发Okta的JWT配置 ]) @WebAppConfiguration class SecuritySetupTest { @Autowired private lateinit var context: WebApplicationContext private lateinit var mvc: MockMvc @BeforeEach fun setup() { mvc = MockMvcBuilders .webAppContextSetup(this.context) .apply(springSecurity()) .build() } @Test fun contextLoads() { assertTrue { true } } }
关键说明:
WebMvcConfigurer::class会引入Spring MVC必要的Bean,包括HandlerMappingIntrospector。OktaOAuth2ResourceServerAutoConfiguration::class让Okta自动配置jwtDecoder,避免手动Mock。
内容的提问来源于stack exchange,提问作者zolee
相关产品推荐
相关产品推荐

