首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JJWT令牌解析JUnit测试在NoSuchMethodError中失败

JJWT令牌解析JUnit测试在NoSuchMethodError中失败
EN

Stack Overflow用户
提问于 2022-06-02 12:20:11
回答 1查看 189关注 0票数 0

我有一个使用JJWT库验证JWT的简单方法:

代码语言:javascript
复制
    public void validateExpiryDate(String token) {
        try {
            byte[] secret = configProperties.getTokenSecret().getBytes(StandardCharsets.UTF_8);
            SecretKey hmacKey = new SecretKeySpec(secret, HMAC_SHA_256_ALGORITHM);

            Jwts.parserBuilder()
                    .setSigningKey(hmacKey)
                    .build()
                    .parseClaimsJws(token);
        } catch (JwtException e) {
            throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, INVALID_TOKEN_ERR);
        }
    }

它从配置属性中获取秘密并解析声明。根据JJWT文档,如果令牌有什么问题,这个方法应该抛出一个JwtException,然后我捕捉到它并重新抛出一个ResponseStatusException。因此,为了测试这一点,我有以下测试:

代码语言:javascript
复制
    @Test
    void validatorShouldThrow_when_tokenIsExpired() {
        Date issuedAt = Date.from(Instant.now());
        Date expiresAt = Date.from(issuedAt.toInstant().minus(10, ChronoUnit.MINUTES));
        String jwt = generator.createJWT(JWT_TEST_NAME, JWT_TEST_MAIL, JWT_TEST_SUBJECT, JWT_TEST_ID, issuedAt, expiresAt, CONFIG_PROPERTIES_SECRET);

        assertThrows(ResponseStatusException.class, () -> validator.validateExpiryDate(jwt));
    }

createJWT方法如下:

代码语言:javascript
复制
    public String createJWT(String name, String email, String subject, String id, Date issuedAt, Date expiresAt, String secret) {
        return Jwts.builder()
                .claim("name", name)
                .claim("email", email)
                .setSubject(subject)
                .setId(id)
                .setIssuedAt(issuedAt)
                .setExpiration(expiresAt)
                .signWith(SignatureAlgorithm.HS256, Base64.getDecoder().decode(secret))
                .compact();
    }

因此,当我运行这个测试时,我没有得到预期的ResponseStatusException,而是得到了一个org.opentest4j.AssertionFailedError: Unexpected exception type thrown ==> expected: <org.springframework.web.server.ResponseStatusException> but was: <java.lang.NoSuchMethodError>错误,并且在堆栈跟踪- Caused by: java.lang.NoSuchMethodError: io.jsonwebtoken.Jwts.parserBuilder()Lio/jsonwebtoken/JwtParserBuilder;更远的地方得到了一个错误。

下面是我在类的类路径中使用的依赖项,其中validateExpiryDate方法是:

代码语言:javascript
复制
    runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.11.5")
    implementation("io.jsonwebtoken:jjwt-api:0.11.5")
    runtimeOnly("io.jsonwebtoken:jjwt-impl:0.11.5")

我在这个类路径中运行了gradle -q dependencies命令,以确保在某个地方没有过时的依赖项,但是我看到的所有jjwt依赖项都是指版本0.11.5,所以这不应该是问题所在。为了确保它不是缓存的依赖项,我从repository中删除了C:\Users\<user>\.m2文件夹,从而刷新了整个本地Maven缓存

为了我的爱,我不明白为什么它找不到parserBuilder方法。我相当肯定它与类路径和依赖关系有关,但是我已经尝试了太多的组合,但是找不到正确的设置。任何想法都欢迎!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-02 14:06:16

事实证明,我只需要在我的测试所在的主应用程序构建文件中使用完全相同的依赖项,就像线程中提到的那样。在此之前,我只有主要的jjwt依赖项- implementation("io.jsonwebtoken:jjwt:0.9.1")

当我添加以下三个时,测试如预期的那样通过了:

代码语言:javascript
复制
    runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.11.5")
    implementation("io.jsonwebtoken:jjwt-api:0.11.5")
    runtimeOnly("io.jsonwebtoken:jjwt-impl:0.11.5")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72476192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档