Powermock - java.lang.IllegalStateException:无法转换类

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/32854688/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 13:13:15  来源:igfitidea点击:

Powermock - java.lang.IllegalStateException: Failed to transform class

javajunitmockitopowermock

提问by Lucky1989

Description:

描述:

I am trying to test a static method from a class. I am using powerMock (1.6.2) + mockito (1.10.19) for mocking along with Junit4 (4.12) & java8.

我正在尝试测试类中的静态方法。我正在使用 powerMock (1.6.2) + mockito (1.10.19) 与 Junit4 (4.12) & java8 一起进行模拟。

Issue:

问题:

Getting the error: "Failed to transform class with name com.gs.ops.domain.StaticClass Reason: java.io.IOException: invalid constant type: 18"

获取错误:“无法转换名称为 com.gs.ops.domain.StaticClass 的类原因:java.io.IOException:常量类型无效:18”

Solutions Tried:

尝试的解决方案:

  1. Googled threads for issue on with powermock - mockito & java-8

  2. Excluded java assist from powermock and added java assist 3.19.0-GA

  3. Tried different versions of powermock (1.5.4, 1.6.2...)

  1. Powermock 问题的 Google 搜索线程 - mockito & java-8

  2. 从 powermock 中排除 Java 辅助并添加了 Java 辅助 3.19.0-GA

  3. 尝试了不同版本的 powermock (1.5.4, 1.6.2 ...)

Below is the exception stack trace:

以下是异常堆栈跟踪:

 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 file:

pom文件:

<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>

回答by JDev

Powermock 1.6.3 uses javassist 3.15.2-GA which does not support certain types. Using 3.18.2-GA javassist worked for me. You may want to override dependency in your project.

Powermock 1.6.3 使用不支持某些类型的 javassist 3.15.2-GA。使用 3.18.2-GA javassist 对我有用。您可能希望覆盖项目中的依赖项。

    <dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.18.2-GA</version>
    </dependency>

You may face another problem for which the solution lies here Mockito + PowerMock LinkageError while mocking system class

模拟系统类时,您可能会面临另一个问题,解决方案就在这里Mockito + PowerMock LinkageError

Hope this helps.

希望这可以帮助。

回答by Swarup Donepudi

This is caused because of the conflict of dependencies. Resolving the dependency conflicts is one way to resolve this issue and the other way is to reorder <dependency></dependency>elements in your pom.xml. Move the powermock dependency declarations to the top of the <dependencies></dependencies>section. This is a complete hack and the right way to resolve it would be to resolve the dependency conflicts.

这是因为依赖冲突导致的。解决依赖冲突是解决此问题的一种方法,另一种方法是重新排序<dependency></dependency>pom.xml 中的元素。将 powermock 依赖声明移到该<dependencies></dependencies>部分的顶部。这是一个完整的 hack,解决它的正确方法是解决依赖冲突。

To identify those conflict you may use the command "mvn dependency:tree". Here is the dependency tree for my application for which I came across this same problem. Notice that there are two dependencies of "javassist" in the tree.

要识别这些冲突,您可以使用命令“mvn dependency:tree”。这是我的应用程序的依赖树,我遇到了同样的问题。请注意,树中有两个“javassist”依赖项。

[INFO] +- org.mockito:mockito-core:jar:1.10.19:test
[INFO] |  +- org.hamcrest:hamcrest-core:jar:1.1:compile
[INFO] |  \- org.objenesis:objenesis:jar:2.1:compile
[INFO] +- org.powermock:powermock-module-junit4:jar:1.6.4:test
[INFO] |  \- org.powermock:powermock-module-junit4-common:jar:1.6.4:test
[INFO] |     +- org.powermock:powermock-core:jar:1.6.4:compile
[INFO] |     <span style="background-color: #FFFF00">|  \- org.javassist:javassist:jar:3.20.0-GA:compile</span>
[INFO] |     \- org.powermock:powermock-reflect:jar:1.6.4:compile
[INFO] +- org.powermock:powermock-api-mockito:jar:1.6.4:compile
[INFO] |  \- org.powermock:powermock-api-support:jar:1.6.4:compile
[INFO] +- org.slf4j:slf4j-log4j12:jar:1.7.14:compile
[INFO] |  +- org.slf4j:slf4j-api:jar:1.7.14:compile
[INFO] |  \- log4j:log4j:jar:1.2.17:compile
[INFO] |  +- org.apache.struts:struts2-core:jar:2.3.16.3-atlassian-6:provided
[INFO] |  |  \- ognl:ognl:jar:3.0.6:provided
<span style="background-color: #FFFF00">
[INFO] |  |     \- javassist:javassist:jar:3.11.0.GA:provided</span>
[INFO] |  +- com.atlassian:webwork-compat:jar:1.24:provided
[INFO] |  +- org.freemarker:freemarker:jar:2.3.16-atlassian-34:provided
[INFO] |  |  \- logkit:logkit:jar:1.2:provided
[INFO] |  +- opensymphony:sitemesh:jar:2.5-atlassian-6:provided
[INFO] |  +- commons-fileupload:commons-fileupload:jar:1.3.1:provided
[INFO] |  +- org.tuckey:urlrewritefilter:jar:4.0.3:provided
[INFO] |  +- velocity-tools:velocity-tools:jar:1.2:provided
[INFO] |  +- commons-dbutils:commons-dbutils:jar:1.3:provided
[INFO] |  +- org.hamcrest:hamcrest-all:jar:1.3:provided
[INFO] |  +- com.atlassian.bamboo:atlassian-user-crowd-provider:jar:5.10.0:provided
[INFO] |  |  +- com.atlassian.crowd:crowd-integration-client-rest:jar:2.7.2:provided
[INFO] |  |  |  \- com.atlassian.crowd:crowd-integration-client-common:jar:2.7.2:provided
[INFO] |  |  |     \- com.atlassian.security:atlassian-cookie-tools:jar:3.2:provided
[INFO] |  |  +- com.atlassian.crowd:crowd-integration-api:jar:2.7.2:provided
[INFO] |  |  |  \- com.atlassian.crowd:embedded-crowd-api:jar:2.7.2:provided
[INFO] |  |  +- com.atlassian.user:atlassian-user-api:jar:4.1.1:provided
[INFO] |  |  |  \- com.opensymphony.propertyset:api:jar:1.6.0-m1:provided
[INFO] |  |  +- com.atlassian.user:atlassian-user-ldap:jar:4.1.1:provided
[INFO] |  |  +- org.acegisecurity:acegi-security:jar:1.0.4:provided
[INFO] |  |  |  \- oro:oro:jar:2.0.8:provided
[INFO] |  |  \- com.atlassian.crowd:crowd-integration-seraph25:jar:2.7.2:provided
[INFO] |  +- javax.xml.stream:stax-api:jar:1.0-2:provided
[INFO] |  +- com.atlassian.core:atlassian-core:jar:5.0.2:provided
[INFO] |  |  \- com.atlassian.image:atlassian-image-consumer:jar:1.0.1:provided
[INFO] |  +- org.apache.maven:maven-embedder:jar:3.0.4:provided
[INFO] |  |  +- org.apache.maven:maven-settings:jar:3.0.4:provided
[INFO] |  |  +- org.apache.maven:maven-plugin-api:jar:3.0.4:provided
[INFO] |  |  +- org.apache.maven:maven-model-builder:jar:3.0.4:provided
[INFO] |  |  +- org.apache.maven:maven-compat:jar:3.0.4:provided
[INFO] |  |  +- org.codehaus.plexus:plexus-classworlds:jar:2.4:provided
[INFO] |  |  +- org.sonatype.sisu:sisu-inject-plexus:jar:2.3.0:provided
[INFO] |  |  |  \- org.sonatype.sisu:sisu-inject-bean:jar:2.3.0:provided
[INFO] |  |  +- org.codehaus.plexus:plexus-component-annotations:jar:1.5.5:provided
[INFO] |  |  +- org.sonatype.plexus:plexus-sec-dispatcher:jar:1.3:provided
[INFO] |  |  +- org.sonatype.plexus:plexus-cipher:jar:1.7:provided
[INFO] |  |  \- commons-cli:commons-cli:jar:1.2:provided
[INFO] |  +- org.apache.maven:maven-model:jar:3.0.4:provided
[INFO] |  +- com.octo.captcha:jcaptcha:jar:2.0-alpha-1:provided
[INFO] |  +- com.octo.captcha:jcaptcha-api:jar:2.0-alpha-1:provided
[INFO] |  +- com.jhlabs:filters:jar:2.0.235:provided
[INFO] |  +- org.apache.struts:struts2-sitemesh-plugin:jar:2.1.8.1:provided
[INFO] |  +- org.slf4j:jul-to-slf4j:jar:1.7.10:provided
[INFO] |  +- com.atlassian.plugins:atlassian-plugins-schema:jar:4.0.5:provided
[INFO] |  |  \- com.atlassian.plugins:atlassian-plugins-osgi:jar:4.0.5:provided
[INFO] |  |     +- com.atlassian.plugins:atlassian-plugins-osgi-events:jar:4.0.5:provided
[INFO] |  |     +- biz.aQute.bnd:biz.aQute.bndlib:jar:2.4.1:provided
[INFO] |  |     +- org.apache.felix:org.apache.felix.framework:jar:4.2.1:provided
[INFO] |  |     \- org.twdata.pkgscanner:package-scanner:jar:0.9.5:provided
[INFO] |  \- xerces:xercesImpl:jar:2.11.0:provided
[INFO] |     \- xml-apis:xml-apis:jar:1.4.01:provided
[INFO] +- junit:junit:jar:4.12:test
[INFO] +- info.cukes:cucumber-java:jar:1.2.4:test
[INFO] |  \- info.cukes:cucumber-core:jar:1.2.4:test
[INFO] |     +- info.cukes:cucumber-html:jar:0.2.3:test
[INFO] |     +- info.cukes:cucumber-jvm-deps:jar:1.0.5:test
[INFO] |     \- info.cukes:gherkin:jar:2.12.2:test
[INFO] +- info.cukes:cucumber-junit:jar:1.2.4:test
[INFO] +- com.atlassian.plugins:atlassian-plugins-osgi-testrunner:jar:1.2.3:test
[INFO] |  +- org.apache.wink:wink-client:jar:1.1.3-incubating:test
[INFO] |  |  +- org.apache.wink:wink-common:jar:1.1.3-incubating:test
[INFO] |  |  |  \- org.apache.geronimo.specs:geronimo-annotation_1.1_spec:jar:1.0:test
[INFO] |  |  +- javax.xml.bind:jaxb-api:jar:2.2:test
[INFO] |  |  \- com.sun.xml.bind:jaxb-impl:jar:2.2.1.1:test
[INFO] |  +- commons-io:commons-io:jar:1.4:provided
[INFO] |  \- com.atlassian.upm:upm-api:jar:2.15:test
[INFO] +- javax.ws.rs:jsr311-api:jar:1.1.1:provided
[INFO] +- com.google.code.gson:gson:jar:2.2.2-atlassian-1:compile
[INFO] +- com.mashape.unirest:unirest-java:jar:1.3.3:compile
[INFO] +- org.apache.httpcomponents:httpclient:jar:4.3.1:compile
[INFO] |  +- org.apache.httpcomponents:httpcore:jar:4.3:compile
[INFO] |  \- commons-codec:commons-codec:jar:1.6:compile
[INFO] +- org.apache.httpcomponents:httpasyncclient:jar:4.0:compile
[INFO] |  \- org.apache.httpcomponents:httpcore-nio:jar:4.3:compile
[INFO] +- org.apache.httpcomponents:httpmime:jar:4.3.1:compile
[INFO] +- org.json:json:jar:20090211:compile
[INFO] +- com.fasterxml.Hymanson.core:Hymanson-core:jar:2.3.3:compile
[INFO] \- com.fasterxml.Hymanson.core:Hymanson-databind:jar:2.3.3:compile
[INFO]    \- com.fasterxml.Hymanson.core:Hymanson-annotations:jar:2.3.0:compile

I hope this helps.

我希望这有帮助。

回答by k6ps

In my case, a "java.io.IOException: invalid constant type: 18" was caused by multiple versions of javassist libraries in my classpath - both 3.12.1.GA and 3.18.2-GA. The problem disappeared when i removed the older one.

就我而言,“java.io.IOException: invalid constant type: 18”是由我的类路径中多个版本的 javassist 库引起的 - 3.12.1.GA 和 3.18.2-GA。当我删除旧的时,问题就消失了。

回答by prayagupd

So there seems to be issue with javassist(bytecode toolkit) prior to 3.18.2, as there's a resolved JIRA ticket-223.

因此,javassist之前的 (bytecode toolkit)似乎存在问题3.18.2,因为有一个已解决的JIRA ticket-223

1 -To find javassist version in your pom.xml, can use mvn dependencytask

1 -要在 pom.xml 中查找 javassist 版本,可以使用mvn dependency任务

$ mvn dependency:tree | grep javassist
[INFO] |     \- org.javassist:javassist:jar:3.14.0-GA:compile

which is used by the powermock-module-junit4-rule,

powermock-module-junit4-rule, 使用

[INFO] +- org.powermock:powermock-module-junit4-rule:jar:1.4.9:test
[INFO] |  +- org.powermock:powermock-classloading-base:jar:1.4.9:test
[INFO] |  \- org.powermock:powermock-core:jar:1.4.9:compile
[INFO] |     \- org.javassist:javassist:jar:3.14.0-GA:compile

2 -So, updating the javassistversion by explicitly to any versions >= 3.18.2should work.

2 -因此,将javassist版本明确更新为任何版本>= 3.18.2都应该可行。

As, in my case, I am using use 3.20.0-GA

因为,就我而言,我正在使用 use 3.20.0-GA

    <dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.20.0-GA</version>
    </dependency>

Working eg. with scalatest

工作例如。和scalatest

@PowerMockIgnore(Array("javax.management.*"))
@RunWith(classOf[PowerMockRunner])
@PrepareForTest(Array(classOf[Configurator]))
class LogServiceSpec {

  @Test
  def initialises_log4j2_on_each_instance_call() {
    PowerMockito.mockStatic(classOf[Configurator])

    val logService1 = new LogService
    PowerMockito.verifyStatic(Mockito.times(1))
    Configurator.initialize(Matchers.anyString(), Matchers.eq("log4j.config"))
  }
}

回答by CodeClimber

Not really an answer! I got a similar error when running a Maven build with JDK8 and generating Java6 byte code. My pom looks like this:

真的不是答案!使用 JDK8 运行 Maven 构建并生成 Java6 字节码时,我遇到了类似的错误。我的 pom 看起来像这样:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <compilerVersion>1.6</compilerVersion>
                <source>1.6</source>
                <target>1.6</target>
                <maxmem>2000m</maxmem>
                <fork>true</fork>
            </configuration>
        </plugin>

When I reverted to JDK6 I no longer got the error.

当我恢复到 JDK6 时,我不再收到错误消息。

回答by Amit Garg

In my case JRE System Library --> Execution Environment was set up on JavaSE-1.7, but the only installed JRE was JRE1.8. So it was pointing to java 8 in place of java 7. Once I moved to java 7 it start working fine for me.

就我而言,JRE 系统库 --> 执行环境是在 JavaSE-1.7 上设置的,但唯一安装的 JRE 是 JRE1.8。所以它指向java 8而不是java 7。一旦我移到java 7,它就开始为我工作。

enter image description here

在此处输入图片说明

回答by Aguid

This issue is related to a compatibility issue with Java 8. could you execute your tests on java 7 ?

此问题与 Java 8 的兼容性问题有关。您能否在 Java 7 上执行测试?