Kotlin中MockMvc注册测试遇JWT密钥长度不足报错的解决方法
问题分析与解决步骤
首先,你的测试返回400的核心原因是后端JWT使用的HMAC-SHA密钥长度不足256位,不符合JWA规范要求,同时你的测试代码本身也有两处明显问题:
一、先修复测试代码的基础错误
- JSON字符串语法错误:你拼接的请求体里,
\"\"username多了一个双引号,正确写法如下:
.content("{\"email\" : \"email\", " + "\"username\" : \"username\", " + "\"password\" : \"password\", " + "\"userType\" : \"artist\"}")
- Authorization头无效:
Base64()是创建Base64对象,不是编码后的凭证字符串。如果注册接口不需要Authorization认证,直接去掉这个header;如果需要,要传入正确的Base64编码授权内容。
二、解决JWT密钥长度问题
方案1:替换为符合规范的密钥
如果后端确实需要JWT校验,用JJWT库提供的工具生成合规密钥:
import io.jsonwebtoken.security.Keys import io.jsonwebtoken.SignatureAlgorithm // 生成HS256算法对应的256位密钥 val secureKey = Keys.secretKeyFor(SignatureAlgorithm.HS256) // 将密钥转为Base64字符串,配置到后端JWT密钥参数中 val keyString = java.util.Base64.getEncoder().encodeToString(secureKey.encoded)
把生成的keyString替换掉当前使用的192位密钥(不管是配置文件还是代码硬编码的)。
方案2:Mock JWT校验逻辑(仅测试业务场景)
如果集成测试只想验证注册接口的业务逻辑,不想触发真实JWT校验,可以在测试类中mock掉JWT验证组件:
import org.springframework.boot.test.mock.mockito.MockBean import com.yourpackage.JwtAuthenticationService // 替换成你实际的JWT服务类 @SpringBootTest @AutoConfigureMockMvc class SignupTest { @MockBean private lateinit var jwtAuthenticationService: JwtAuthenticationService @Test fun userSignup() { // 提前mock验证通过的逻辑 Mockito.`when`(jwtAuthenticationService.validateToken(anyString())).thenReturn(true) // 后续的mockMvc请求逻辑... } }
这样就能绕过真实的JWT密钥校验,专注测试注册接口的业务返回。
三、关于“抽象测试库不应出现底层错误”的说明
集成测试会触发完整的后端流程,包括安全校验逻辑,所以这类底层配置错误会直接暴露出来。如果想隔离测试,可以改用单元测试单独测试控制器层,或者通过mock依赖组件避免触发完整的安全校验链。
内容的提问来源于stack exchange,提问作者demet47
相关产品推荐
相关产品推荐

