Java 测试令牌的有效时间

Java 测试令牌的有效时间,java,spring,unit-testing,testing,junit,Java,Spring,Unit Testing,Testing,Junit,我想测试我的令牌的有效时间,以及当我编写代码并重新启动服务器时密钥的更改。由于这个原因,我的考试总是不及格。我怎样才能修好它 以下是我的iExpired及其辅助方法: final Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256); //This key always // change if i restart server . . . public boolean isExpired(String token) { Claims

我想测试我的令牌的有效时间,以及当我编写代码并重新启动服务器时密钥的更改。由于这个原因,我的考试总是不及格。我怎样才能修好它

以下是我的iExpired及其辅助方法:

final Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256); //This key always
// change if i restart server
.
.
.
public boolean isExpired(String token) {
    Claims claims = getClaims(token);
    return claims.getExpiration().after(new Date(System.currentTimeMillis()));
}

private Claims getClaims(String token) {
    return Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody();
}

遗憾的是,您没有提供有关用于生成
键的库的任何信息。根据API,我想是吧

如中所述,您可以了解为什么每次运行测试时都会获得另一个密钥

在幕后,JJWT使用JCA提供程序的KeyGenerator为给定算法创建具有正确最小长度的安全随机密钥

因此,库的正常行为是每次调用
Keys.secretKeyFor
时生成一个新的随机
Key

除了这些一般信息,还有解决问题的方法:

如果需要保存此新SecretKey,可以对其进行Base64(或Base64URL)编码:

如果要在每次测试运行时使用相同的
,则应在每次测试之前反序列化相同的Base64字符串。
对于反序列化,您可以使用
base64解码器
并将
字节[]
传递到
SecretKey.hmacshakey中以用于
-方法。 您的代码应该是这样的

byte[] decodedKey = Decoders.BASE64.decode("Your_Base64_key");
SecretKey key = SecretKey.hmacShaKeyFor(decodedKey);
我建议您将Base64编码的
Secret
存储在testsourceroot的resources文件夹中


另外,我建议您将当前日期传递到
isExpired
-方法中,因为否则您的测试依赖于系统当前时间。
您应该尝试消除单元测试中的所有动态因素。否则,它们将变得脆弱,并开始“随机”失败。

与问题无关,但看起来isExpired方法中可能存在错误。如果索赔过期时间超过当前时间,则该方法返回
true
。正确的行为可能是返回
true
,如果声明的过期时间早于当前时间。我没有意识到这一点。当使用isExpired时,我基本上使用它的相反形式,因为这个原因我的代码工作得很好,但为了可读性,我应该修复它。谢谢。@dnault
byte[] decodedKey = Decoders.BASE64.decode("Your_Base64_key");
SecretKey key = SecretKey.hmacShaKeyFor(decodedKey);