Powermock - java.lang.IllegalStateException: a Échoué à transformer la classe
Description:
Je suis en train de tester une méthode statique d'une classe. Je suis à l'aide de powerMock (1.6.2) + mockito (1.10.19) pour se moquant avec Junit4 (4.12) & java8.
Question:
L'obtention de l'erreur: "impossible de transformer la classe avec le nom de la com.gs.ops.domaine.StaticClass Raison: java.io.IOException: invalid constante de type: 18"
Les Solutions Essayées:
-
Googlé fils de problème avec powermock - mockito & java-8
-
Exclus java aider de powermock et a ajouté java aider 3.19.0-GA
-
Essayé différentes versions de powermock (1.5.4, 1.6.2...)
Ci-dessous est la trace de pile d'exception:
java.lang.IllegalStateException: Failed to transform class with name com.StaticClass. Reason: java.io.IOException: invalid constant type: 18
at org.powermock.core.classloader.MockClassLoader.loadMockClass(MockClassLoader.java:266)
at org.powermock.core.classloader.MockClassLoader.loadModifiedClass(MockClassLoader.java:180)
at org.powermock.core.classloader.DeferSupportingClassLoader.loadClass(DeferSupportingClassLoader.java:68)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:340)
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:145)
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:40)
at org.powermock.tests.utils.impl.AbstractTestSuiteChunkerImpl.createTestDelegators(AbstractTestSuiteChunkerImpl.java:244)
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.<init>(JUnit4TestSuiteChunkerImpl.java:61)
at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.<init>(AbstractCommonPowerMockRunner.java:32)
at org.powermock.modules.junit4.PowerMockRunner.<init>(PowerMockRunner.java:34)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67)
Caused by: java.lang.RuntimeException: java.io.IOException: invalid constant type: 18
at javassist.CtClassType.getClassFile2(CtClassType.java:203)
at javassist.compiler.MemberResolver.lookupMethod(MemberResolver.java:110)
at javassist.compiler.MemberResolver.lookupMethod(MemberResolver.java:96)
at javassist.compiler.TypeChecker.atMethodCallCore(TypeChecker.java:704)
at javassist.expr.NewExpr$ProceedForNew.setReturnType(NewExpr.java:243)
at javassist.compiler.JvstTypeChecker.atCallExpr(JvstTypeChecker.java:146)
at javassist.compiler.ast.CallExpr.accept(CallExpr.java:45)
at javassist.compiler.TypeChecker.atVariableAssign(TypeChecker.java:248)
at javassist.compiler.TypeChecker.atAssignExpr(TypeChecker.java:217)
at javassist.compiler.ast.AssignExpr.accept(AssignExpr.java:38)
at javassist.compiler.CodeGen.doTypeCheck(CodeGen.java:241)
at javassist.compiler.CodeGen.atStmnt(CodeGen.java:329)
at javassist.compiler.ast.Stmnt.accept(Stmnt.java:49)
at javassist.compiler.CodeGen.atStmnt(CodeGen.java:350)
at javassist.compiler.ast.Stmnt.accept(Stmnt.java:49)
at javassist.compiler.CodeGen.atIfStmnt(CodeGen.java:404)
at javassist.compiler.CodeGen.atStmnt(CodeGen.java:354)
at javassist.compiler.ast.Stmnt.accept(Stmnt.java:49)
at javassist.compiler.Javac.compileStmnt(Javac.java:568)
at javassist.expr.NewExpr.replace(NewExpr.java:206)
at org.powermock.core.transformers.impl.MainMockTransformer$PowerMockExpressionEditor.edit(MainMockTransformer.java:418)
at javassist.expr.ExprEditor.loopBody(ExprEditor.java:211)
at javassist.expr.ExprEditor.doit(ExprEditor.java:90)
at javassist.CtClassType.instrument(CtClassType.java:1374)
at org.powermock.core.transformers.impl.MainMockTransformer.transform(MainMockTransformer.java:74)
at org.powermock.core.classloader.MockClassLoader.loadMockClass(MockClassLoader.java:251)
... 24 more
Caused by: java.io.IOException: invalid constant type: 18
at javassist.bytecode.ConstPool.readOne(ConstPool.java:1090)
at javassist.bytecode.ConstPool.read(ConstPool.java:1033)
at javassist.bytecode.ConstPool.<init>(ConstPool.java:149)
at javassist.bytecode.ClassFile.read(ClassFile.java:737)
at javassist.bytecode.ClassFile.<init>(ClassFile.java:108)
at javassist.CtClassType.getClassFile2(CtClassType.java:190)
... 49 more
Pom fichier:
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.6.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.6.2</version>
<exclusions>
<exclusion>
<groupId>org.junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
<exclusion>
<groupId>org.powermock</groupId>
<artifactId>powermock-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.powermock</groupId>
<artifactId>powermock-reflect</artifactId>
</exclusion>
</exclusions>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.19.0-GA</version>
</dependency>
Vous devez vous connecter pour publier un commentaire.
Powermock 1.6.3 utilise javassist 3.15.2-GA qui ne prend pas en charge certains types. À l'aide de 3.18.2-GA javassist a fonctionné pour moi. Vous pouvez ignorer les dépendances de votre projet.
Vous pouvez faire face à un autre problème dont la solution se trouve ici Mockito + PowerMock LinkageError tout en se moquant de système de classe
Espère que cette aide.
Il semble donc y avoir problème avec
javassist
(bytecode toolkit) avant3.18.2
, comme il est résolu JIRA billet-223.1 - Pour trouver javassist version dans votre pom.xml peuvent utiliser
mvn dependency
tâchequi est utilisé par le
powermock-module-junit4-rule
,2 - Ainsi, la mise à jour de la
javassist
version explicitement à toutes les versions>= 3.18.2
devrait fonctionner.Que, dans mon cas, je suis d'utilisation
3.20.0-GA
De travail par exemple. avec
scalatest
Cela est dû en raison du conflit de dépendances. Résoudre les conflits de dépendance est une façon de résoudre ce problème et de l'autre façon est de réorganiser
<dependency></dependency>
éléments dans votre pom.xml. Déplacer le powermock dépendance déclarations en haut de la<dependencies></dependencies>
section. C'est un hack et la bonne façon de le résoudre serait de résoudre les conflits de dépendance.À identifier les conflits, vous pouvez utiliser la commande "mvn dependency:tree". Voici l'arbre des dépendances pour mon application pour laquelle je suis tombé sur ce même problème. Notez qu'il existe deux dépendances de "javassist" dans l'arborescence.
J'espère que cette aide.
Dans mon cas, un "java.io.IOException: invalid constante de type: 18" a été causé par de multiples versions de javassist bibliothèques dans mon classpath - deux 3.12.1.GA et 3.18.2-GA. Le problème a disparu quand j'ai enlevé l'ancienne.
Pas vraiment une réponse! J'ai eu une erreur similaire lors de l'exécution de Maven build avec JDK8 et de génération de Java6 de byte code. Mon pom ressemble à ceci:
Quand je revenue à JDK6 je n'ai plus eu le message d'erreur.
Dans mon cas JRE System Library --> Environnement d'Exécution a été mis en place sur JavaSE-1.7, mais le seul installé le JRE est JRE1.8. Il était donc pointant vers java 8 à la place de java 7. Une fois que j'ai déménagé à java 7, il commencer à travailler très bien pour moi.
Ce problème est lié à un problème de compatibilité avec Java 8. pourriez-vous exécuter vos tests sur java 7 ?