java.lang.VerifyError:使用PowerMockRunner时,应在分支处使用stackmap帧

java.lang.VerifyError:使用PowerMockRunner时,应在分支处使用stackmap帧,java,java-8,powermock,verifyerror,mrunit,Java,Java 8,Powermock,Verifyerror,Mrunit,在我的项目中,我将MRUnit版本升级到1.1.0,以使用ReducedDriver测试多个输出。在对我的测试进行更改(使其与升级一起工作)后,我收到以下错误: java.lang.VerifyError: Expecting a stackmap frame at branch target 63 Exception Details: Location: (path to test class) Reason: Expected stackmap frame at this location.

在我的项目中,我将MRUnit版本升级到1.1.0,以使用ReducedDriver测试多个输出。在对我的测试进行更改(使其与升级一起工作)后,我收到以下错误:

java.lang.VerifyError: Expecting a stackmap frame at branch target 63
Exception Details:
Location: (path to test class)
Reason: Expected stackmap frame at this location.
Bytecode: (Bytecode)
我的测试如下所示(我特意删除了代码以使其更简洁):

@RunWith(PowerMockRunner.class)
@PrepareForTest(MultipleOutputs.class)
公共类myReducerTest{
私有还原驱动程序还原驱动程序;
@以前
公共作废设置(){
reducedDriver=reducedDriver.newreducedDriver(new myReducer());
}
@试验
public void testHappyPath()引发IOException{
/*
用于声明输入键、输入输出值、预期输出等的代码。
*/
使用输入(myInputKey、myInputVal)还原驱动程序;
具有多输出的简化驱动程序(“reportName1”,键,期望值1);
具有多输出的简化驱动程序(“reportName2”,键,期望值2);
reduceDriver.runTest();
}
}
当我使用@PrepareForTest时,我得到了错误。请注意,myReducer类没有静态或最终方法。这就是为什么@PrepareForTest注释中不包含它的原因。我的pom文件的一部分(我正在使用maven进行构建)如下所示:

    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-all</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-mockito</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-core</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-easymock</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.mrunit</groupId>
        <artifactId>mrunit</artifactId>
        <version>1.1.0</version>
        <classifier>hadoop2</classifier>
        <scope>test</scope>
    </dependency>

org.mockito

我还尝试在pom文件中添加surefire插件,如下所述:


在这种情况下,这些解决方案都不起作用。

作为临时修复,您可以向JVM参数中添加-noverify。但不要在任何版本中使用此选项

我遇到了类似的问题,并找到了以下链接: .

MRUnit1.1.0使用PowerMock 1.5.1。它使用JavaAssist 3.18.0-GA。
JavaAssist 3.18.2-GA包含对verifyError的修复

排除MRUnit中旧的PowerMock依赖项,并将其替换为PowerMock 1.5.5或更高版本。这些PowerMock版本包含固定的JavaAssist版本

    <dependency> (all PowerMock dependencies)
        ... PowerMock dependency ...
        <version>1.5.5(or higher)</version>
    </dependency>

    <dependency>
        <groupId>org.apache.mrunit</groupId>
        <artifactId>mrunit</artifactId>
        <version>1.1.0</version>
        <exclusions>
            ...insert all PowerMock exclusions...
        </exclusions>
        <classifier>hadoop2</classifier>
        <scope>test</scope>
    </dependency>
(所有PowerMock依赖项)
... PowerMock依赖项。。。
1.5.5(或更高)
org.apache.mrunit
mrunit
1.1.0
…插入所有PowerMock排除项。。。
hadoop2
测试
也许你可以检查一下。在我的情况下,更改为最新的有效版本。现在,我的版本是2.0.7


2.0.7

如果您认为有人建议将surefire插件添加到您的pom文件中,您必须提高阅读技能。真正地(我所说的“阅读”是指“阅读和理解”)。我可以试着进一步解释,但如果你能像阅读链接答案一样阅读我的解释,那就没用了。@Holger我是Java新手。Maven在构建时从POM文件中提取所有内容,所以我做了一个假设。检查此链接插件信息是否在Project/Build下这与Java无关。这只是关于阅读一篇文章并理解它所说的内容。没有人说你应该安装那个插件。试着理解上一句话。提示:如果你真的是Java新手,那么为了你自己:远离PowerMock。PowerMock带来的麻烦比好的多。@Jägermeister我不得不使用PowerMock,因为MultipleOutputs类有静态方法。甚至ReducedDriver(MRUnit包的一部分)也在使用PowerMock。您能推荐PowerMock的替代方案吗?
    <dependency> (all PowerMock dependencies)
        ... PowerMock dependency ...
        <version>1.5.5(or higher)</version>
    </dependency>

    <dependency>
        <groupId>org.apache.mrunit</groupId>
        <artifactId>mrunit</artifactId>
        <version>1.1.0</version>
        <exclusions>
            ...insert all PowerMock exclusions...
        </exclusions>
        <classifier>hadoop2</classifier>
        <scope>test</scope>
    </dependency>