如何在JUnit 5 Java中模拟JsonWebToken库

如何在JUnit 5 Java中模拟JsonWebToken库,java,junit,jwt,Java,Junit,Jwt,我有一个返回JsonWebToken的身份验证服务 首先,它验证提供的令牌,读取声明,然后基于该数据生成一个新的声明 下面是执行特定操作的方法: @覆盖 公共字符串身份验证(字符串appName、字符串zendeskJwt){ 字符串zendeskPublicKeyString=zendeskService.getAppPublicKey(appName); RSAPublicKey zendeskPublicKey=asymmetricKeyParser.publicKey(zendeskPu

我有一个返回JsonWebToken的身份验证服务

首先,它验证提供的令牌,读取声明,然后基于该数据生成一个新的声明

下面是执行特定操作的方法:

@覆盖
公共字符串身份验证(字符串appName、字符串zendeskJwt){
字符串zendeskPublicKeyString=zendeskService.getAppPublicKey(appName);
RSAPublicKey zendeskPublicKey=asymmetricKeyParser.publicKey(zendeskPublicKeyString);
Jws parsedZendeskJws=Jwts.parserBuilder()
.setSigningKey(zendeskPublicKey)
.build()
.parseClaimsJws(zendeskJwt);
字符串zendeskUserReference=parsedZendeskJws.getBody().getSubject();
ZendeskUser=zendeskService.getZendeskUser(zendeskUserReference);
日期currentTime=新日期(System.currentTimeMillis());
Date expirationTime=新日期(currentTime.getTime()+CspExcite JWTProperties.getExpirationDuration().toMillis());
RSAPrivateKey cspPrivateKey=asymmetricKeyParser.privateKey(cspExceiveJWTProperties.getPrivateKey());
返回Jwts.builder()
.setIssuedAt(当前时间)
.setExpiration(到期时间)
.claim(claim\u ZENDESK\u AGENT\u ID,zendeskUser.getId())
.claim(claim\u HYDRA\u USER\u ID,zendeskUser.getExternalId())
.signWith(CSPrivateKey)
.compact();
}
代码本身工作得很好。我的问题是关于单元测试的。我想测试一下这个方法

我试着检查了很多材料,但没有一个对我有用。 根据消息来源,每个人都说嘲笑图书馆本身不是一个好主意。 但我不太确定如何在不模仿Jwt库的情况下通过单元测试。 我有集成测试,这是一个不同的场景。对于单元测试,我不应该提出任何真正的请求

这是我到目前为止试过的

private RSAPrivateKey privateKey()抛出NoSuchAlgorithmException、InvalidKeySpecException{
String parsedPrivateKey=私钥
.replace(“----开始私钥-------”,“”)
.replace(“----结束私钥-------”,“”)
.replaceAll(“\\n”和“).trim();
KeyFactory-KeyFactory=KeyFactory.getInstance(“RSA”);
var decoded=Base64.getDecoder().decode(parsedPrivateKey);
PKCS8EncodedKeySpec PKCS8=新的PKCS8EncodedKeySpec(已解码);
return(RSAPrivateKey)keyFactory.generatePrivate(keySpecPKCS8);
}
私有字符串generateJwt()引发InvalidKeySpecException,NoSuchAlgorithException{
RSAPrivateKey csprivateKey=privateKey();
System.out.println(CSPrivateKey);
durationexpirationduration=Duration.parse(“PT20M”);
日期currentTime=新日期(System.currentTimeMillis());
Date expirationTime=新日期(currentTime.getTime()+expirationDuration.toMillis());
返回Jwts.builder()
.setIssuedAt(当前时间)
.setExpiration(到期时间)
.claim(claim\u ZENDESK\u AGENT\u ID,123)
.索赔(索赔号为“123”)
.signWith(CSPrivateKey)
.compact();
}
@试验
void authenticate()引发InvalidKeySpecException,NoSuchAlgorithmException{
字符串appName=“appName”;
字符串zendeskJwt=generateJwt();
RSAPublicKey zendeskPublicKey=新的AsymmetricKeyParser().publicKey(公钥);
ZendeskUser ZendeskUser=新的ZendeskUser(123,“123”);
Jws-Jws=newjws(){
@凌驾
公共JwsHeader getHeader(){
返回null;
}
@凌驾
公共机构{
返回null;
}
@鬼鬼祟祟
@凌驾
公共字符串getSignature(){
返回generateJwt();
}
};
当(zendeskService.getAppPublicKey(appName)).thenReturn(String.valueOf(zendeskPublicKey));
//这就是我试图嘲笑JWT的方式
何时(Jwts.parserBuilder()
.setSigningKey(zendeskPublicKey)
.build()
.parseClaimsJws(zendeskJwt))。然后返回(jws);
当(zendeskService.getZendeskUser(“//example.com”)。然后返回(zendeskUser);
testObj.authenticate(appName,zendeskJwt);
}
它给了我这个错误

org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'.
For example:
    when(mock.getArticles()).thenReturn(articles);

Also, this error might show up because:
1. you stub either of: final/private/equals()/hashCode() methods.
   Those methods *cannot* be stubbed/verified.
   Mocking methods declared on non-public parent classes is not supported.
2. inside when() you don't call method on mock but on some other object.

欢迎提出任何建议。

如果有人对我如何嘲笑图书馆感兴趣,那么我没有这么做。我模仿了其他所有东西,但没有模仿库本身,所以我添加了预生成的证书和密钥,使其工作。如果有人感兴趣,我是如何模仿库的,我没有这样做。我模仿了其他的一切,但没有模仿库本身,所以我添加了预生成的证书和密钥,使它工作起来。