java.lang.classcastexception怎么解决_java.lang.LinkageError:ClassCastException

我确实遇到过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 obejct的方法,该方法返回一个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 check:

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项目中的所有测试(或者至少我认为是这样)的事实有某种关系.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值