You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中MockMvc注册测试遇JWT密钥长度不足报错的解决方法

问题分析与解决步骤

首先,你的测试返回400的核心原因是后端JWT使用的HMAC-SHA密钥长度不足256位,不符合JWA规范要求,同时你的测试代码本身也有两处明显问题:

一、先修复测试代码的基础错误

  1. JSON字符串语法错误:你拼接的请求体里,\"\"username多了一个双引号,正确写法如下:
.content("{\"email\" : \"email\", " +
        "\"username\" : \"username\", " +
        "\"password\" : \"password\", " +
        "\"userType\" : \"artist\"}")
  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 04:55:21