java.lang.VerifyError:使用PowerMockRunner时,应在分支处使用stackmap帧
在我的项目中,我将MRUnit版本升级到1.1.0,以使用ReducedDriver测试多个输出。在对我的测试进行更改(使其与升级一起工作)后,我收到以下错误: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.
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>