我有一个接收 Jwt 令牌然后提取子值的方法。我想测试它,为此,我应该模拟一个令牌并设置一个子值。然而,我在某种程度上很难正确地做到这一点。
这是我要测试的方法:
public String getSub(JwtAuthenticationToken principal) {
Map<String,Object> info = new HashMap<>();
info.put("sub", principal.getTokenAttributes().get("sub"));
return info.toString().replaceAll("\\{", "").replaceAll("\\}","").replace("sub=", "");
}
这是我迄今为止创建的测试:
@Test
void testEndpoint() {
JwtAuthenticationToken principal = Mockito.mock(JwtAuthenticationToken.class);
Mockito.when(principal.getTokenAttributes()).thenReturn(jwt.getClaims());
String sub = subExtractionService.getSub(principal);
String test = "subValue";
Assertions.assertEquals(test, sub);
}
测试当然不行,因为如上所述,我仍然需要设置 sub 值。这正是我的问题:该怎么做?
JWT 通常会在需要它对用户进行授权的应用程序外部生成。如果您动态调整 JWT,您应该会遇到相应的数据签名问题。
对于您的单元测试,您似乎嘲笑了这个子值。假设您在应用程序运行时也有它,到目前为止没有问题。
但是您知道 JWT 代表 JSON Web Token 吗?令牌的有效负载是 JSON,因此您应该使用 JSON 解析器来正确获取您的值,而不是使用文本替换 hack。