java.lang.LinkageError: ClassCastException

Experimento un problema realmente molesto con TestNG y RESTeasy.

Tengo una clase que ejecuta varias pruebas contra una clase API que usa el marco RESTeasy para exponerse.

Sin embargo, si dejo que la prueba se ejecute con maven (prueba mvn), obtengo la siguiente excepción:

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)

La prueba no hace nada más que llamar a un método del API obejct que devuelve un objeto Response (de RESTeasy). Como marco de prueba, uso TestNG.

Método de prueb

@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"));
}

Descripcion del problem

Parece que el marco RESTeasy carga RuntimeDelegate en un cargador de clases diferente. Si eche un vistazo al código fuente, existe el siguiente método en RuntimeDelegate (que cubre la línea 126): RuntimeDelegate.java.

Así que la declaración principal que está relacionada con el error es la instancia de verificación:

if (!(delegate instanceof RuntimeDelegate))

Si verifico el cargador de clases de la instancia de delegado frente al cargador de clases de RuntimeDelegate, obtengo el siguiente resultado:

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

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

Soy consciente de que esto, por supuesto, no funciona, pero me pregunto por qué el material RESTeasy se carga en el MockClassLoader y no en el otro. Especialmente porque no me burlo del TokenAPI que se prueba.

Hechos extraños

Lo extraño es que cuando ejecuto las pruebas desde IntelliJ (elijo solo ejecutar todas las pruebas de la clase dada que contiene el método que produce el error), entonces se ejecuta. Parece que de alguna manera está relacionado con el hecho de que mvn test ejecuta todas las pruebas del proyecto maven (o al menos eso es lo que supongo).

Respuestas a la pregunta(4)

Su respuesta a la pregunta