java.lang.LinkageError:ClassCastException

乘坐:

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

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

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

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

因此,与错误相关的主要语句是checkof instanceof:

if (!(delegate instanceof RuntimeDelegate))

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

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

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

我知道这当然是行不通的,但是我想知道为什么RESTeasy内容是在MockClassLoader中而不是在另一个中加载的。特别是因为我不嘲笑被测试的TokenAPI。

奇怪的事实

奇怪的是,当我从IntelliJ中运行测试时(我只选择运行给定类中的所有测试,该类包含会产生错误的方法),然后它就会通过。看起来它与mvn测试运行了Maven项目中的所有测试(或至少是我所猜测的)有关。

乘坐:

不幸的是,我无法告诉您为什么会发生这种情况,但是我可以告诉您如何解决此问题。

问题是,PowerMockito扫描了类路径,并且还添加了RESTeasy类(它们位于包'javax.ws。*中。)因此,上述RuntimeDelegate由PowerMockito类加载器加载,并导致了后来的问题,即将该类与来自其他类加载器的类进行了比较。

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

java.lang.LinkageError:ClassCastException RuntimeDelegate.class

java.lang.LinkageError: ClassCastException: 在 Spring MVC 项目中

java.lang.ClassCastException

Java Springboot 2.1 java.lang.LinkageError

java.lang.LinkageError:违反加载约束

获取 java.lang.ClassCastException

java.lang.ClassCastException:错误

修补java.base结果java.lang.LinkageError的

java javassist.CannotCompileException: by java.lang.LinkageError: loader

java.lang.LinkageError:违反加载程序约束

Java.lang.LinkageError RFT-硒-Appium

Spring with Querydsl :java.lang.ClassCastException

运行时java.lang.ClassCastException

java.lang.ClassCastException-Log4j

Jsf错误:java.lang.ClassCastException

java.lang.ClassCastException:创建同步的链表

java.lang.ClassCastException.如何删除?

Collection.toArray()java.lang.ClassCastException

代理创建时的 java.lang.ClassCastException

某些设备上的 java.lang.ClassCastException

randomSplit 期间的 scala java.lang.ClassCastException

java.lang.ClassCastException:[Ljava.lang.Object;

Kotlin:java.lang.ClassCastException:java.lang.Long无法转换为java.lang.Integer

java.lang.RuntimeException:java.lang.ClassCastException:java.lang.Long无法强制转换为java.lang.String

java.lang.ClassCastException:[Ljava.lang.String; 无法转换为java.lang.String

java.lang.ClassCastException in java(Springboot & Mongodb) in springboot get api

如何在 Java 中修复 java.lang.ClassCastException

如何在Java中解决java.lang.ClassCastException?

java.lang.ClassCastException关于在Java中创建类的数组