gpt4 book ai didi

java.lang.LinkageError : ClassCastException 错误

转载 作者:搜寻专家 更新时间:2023-10-30 21:30:07 25 4
gpt4 key购买 nike

我确实遇到了 TestNG 和 RESTeasy 的一个非常烦人的问题。

我确实有一个类针对使用 RESTeasy 框架来公开自身的 API 类运行多个测试。

但是,如果我让测试使用 maven (mvn test) 运行,则会出现以下异常:

java.lang.LinkageError: ClassCastException: attempting to castjar:file:/C:/Users/rit/.m2/repository/org/jboss/resteasy/jaxrs-api/2.3.0.GA/jaxrs-api-2.3.0.GA.jar!/javax/ws/rs/ext/RuntimeDelegate.classtojar:file:/C:/Users/rit/.m2/repository/org/jboss/resteasy/jaxrs-api/2.3.0.GA/jaxrs-api-2.3.0.GA.jar!/javax/ws/rs/ext/RuntimeDelegate.class
at javax.ws.rs.ext.RuntimeDelegate.findDelegate(RuntimeDelegate.java:126)
at javax.ws.rs.ext.RuntimeDelegate.getInstance(RuntimeDelegate.java:96)
at javax.ws.rs.core.Response$ResponseBuilder.newInstance(Response.java:394)
at javax.ws.rs.core.Response.status(Response.java:116)
at javax.ws.rs.core.Response.status(Response.java:130)
at com.pd.api.TokenAPI_V1.validateAccessToken(TokenAPI_V1.java:141)
at com.test.pd.api.TokenAPI_V1Test.testIfValidAccessTokenReturnsCorrectHTTPHeadersWhenTokenIsNotFound(TokenAPI_V1Test.java:359)

测试只是调用 API 对象的一个​​方法,该方法返回一个 Response 对象(来自 RESTeasy)。作为测试框架,我确实使用 TestNG。

测试方法

@Test
public void testIfValidAccessTokenReturnsCorrectHTTPHeadersWhenTokenIsNotFound() throws InvalidAccessTokenException {
Mockito.when(tokenService.validateAccessToken(TestConstants.ACCESS_TOKEN)).thenThrow(new InvalidAccessTokenException());

Response response = tokenAPI_v1.validateAccessToken(TestConstants.ACCESS_TOKEN, TestConstants.USER_AGENT);
assert "no-store".equals(response.getMetadata().getFirst("Cache-Control"));
assert "no-cache".equals(response.getMetadata().getFirst("Pragma"));
}

问题描述

看起来 RESTeasy 框架在不同的类加载器中加载了 RuntimeDelegate。如果我看一下源代码,那么在 RuntimeDelegate(涵盖第 126 行)中有以下方法:RuntimeDelegate.java .

所以与错误相关的主要语句是instanceof检查:

if (!(delegate instanceof RuntimeDelegate))

如果我检查委托(delegate)实例的类加载器与 RuntimeDelegate 的类加载器,则会得到以下输出:

delegate.getClass().getClassLoader() -> org.powermock.core.classloader.MockClassLoader@31e46a68

RuntimeDelegate.class.getClassLoader() -> sun.misc.Launcher$AppClassLoader@3c0fabe9

我知道这当然行不通,但我想知道为什么 RESTeasy 的东西加载到 MockClassLoader 而不是另一个。特别是因为我不模拟经过测试的 TokenAPI。

奇怪的事实

奇怪的是,当我从 IntelliJ 运行测试时(我选择只运行给定类中包含产生错误的方法的所有测试),然后它运行通过。看起来它与 mvn test 运行来自 maven 项目的所有测试这一事实有某种关系(或者至少我猜是这样)。

最佳答案

很遗憾,我无法告诉您发生这种情况的原因,但我可以告诉您如何解决此问题。

问题是,PowerMockito 扫描了类路径并添加了 RESTeasy 类(位于“javax.ws.*”包中。因此,上述 RuntimeDelegate 由 PowerMockito 类加载器加载并导致了后来的问题, 该类与来自不同类加载器的类进行了比较。

要解决此问题,请告诉 PowerMockito 在扫描类时忽略 javax.ws 包:

@PowerMockIgnore({"javax.ws.*"})

关于java.lang.LinkageError : ClassCastException 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8823844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com