簡體   English   中英

java.lang.VerifyError:在使用 PowerMockRunner 時,在分支處需要一個堆棧圖幀

[英]java.lang.VerifyError: Expecting a stackmap frame at branch, when using PowerMockRunner

我在我的項目中將 MRUnit 版本升級到 1.1.0,以使用 ReduceDriver 測試多個輸出。 對我的測試進行更改(使其與升級一起工作)后,我收到此錯誤:

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)
public class myReducerTest {
   private ReduceDriver<Text, Text, Text, Text> reduceDriver;

   @Before
   public void setUp() {
       reduceDriver = ReduceDriver.newReduceDriver(new myReducer());
   }

   @Test
   public void testHappyPath() throws IOException {
       /*
          Code to declare input key, inout value, expected output, etc.
       */

       reduceDriver.withInput(myInputKey, myInputVal);
       reduceDriver.withMultiOutput("reportName1", key, expectedValue1);
       reduceDriver.withMultiOutput("reportName2", key, expectedValue2);
       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>

另請注意,我使用的是 Java 8,並且不能像這里提到的那樣降級到 v7 或 v6: java.lang.VerifyError: Expecting a stackmap frame at branch target

我還嘗試在 pom 文件中添加 surefire 插件,如下所述: java.lang.VerifyError: Expecting a stackmap frame at branch target 73

在這種情況下,這些解決方案都不起作用。

也許你可以檢查這個問題 就我而言,更改為有效的最新版本。現在,我的版本是 2.0.7

<properties>
    <powermock.version>2.0.7</powermock.version>
</properties>

我有一個類似的問題,找到了這個鏈接: https : //github.com/jayway/powermock/issues/375

MRunit 1.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>

作為臨時修復,您可以將-noverify添加到您的 JVM 參數中。 但是不要在任何版本中使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM