测试时出现NoClassDefFoundError:缺失ClientRegistration类
问题解决:MockMvc测试OAuth2资源服务器JWT模式时出现NoClassDefFoundError
问题原因
你使用的SecurityMockMvcRequestPostProcessors.oauth2Login()属于OAuth2客户端模块的测试工具,但你的项目仅配置了OAuth2资源服务器(JWT模式),未引入OAuth2客户端相关依赖。应用运行时不需要客户端代码所以无异常,但测试时调用客户端相关处理器,就会缺失ClientRegistration类。
解决方案
有两种可行方案:
方案1:改用资源服务器JWT对应的测试处理器
既然你的应用是OAuth2资源服务器JWT模式,测试时应使用jwt()处理器模拟已认证的JWT请求,而非客户端登录的oauth2Login()。修改测试代码如下:
mockMvc .perform( MockMvcRequestBuilders.post("/code/test") .contentType(MediaType.APPLICATION_JSON) .content("") .with(SecurityMockMvcRequestPostProcessors.jwt()) ) .andExpect(status().isOk());
若需自定义JWT声明(如用户ID、权限),可扩展配置:
mockMvc .perform( MockMvcRequestBuilders.post("/code/test") .contentType(MediaType.APPLICATION_JSON) .content("") .with(SecurityMockMvcRequestPostProcessors.jwt() .jwt(jwt -> jwt.claim("sub", "user123") .claim("roles", "ROLE_USER"))) ) .andExpect(status().isOk());
方案2:添加OAuth2客户端测试依赖
若坚持使用oauth2Login(),需在测试依赖中加入Spring Security OAuth2客户端模块:
Maven(pom.xml)
<dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-oauth2-client</artifactId> <scope>test</scope> </dependency>
Gradle(build.gradle)
testImplementation 'org.springframework.security:spring-security-oauth2-client'
更推荐方案1,它与你的资源服务器场景匹配,可避免引入不必要的依赖。
内容的提问来源于stack exchange,提问作者Sriram R
相关产品推荐
相关产品推荐

