0

複数の出力をテストするために ReduceDriver を使用するために、プロジェクトで MRUnit バージョンを 1.1.0 にアップグレードしました。テストに変更を加えた後 (アップグレードで動作するようにするため)、次のエラーが発生します。

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クラスには static または final メソッドがないことに注意してください。そのため、 @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

この場合、これらのソリューションはどれも機能しません。

4

3 に答える 3

1

この問題を確認できるかもしれません。私の場合、動作した最新バージョンに変更します。現在、私のバージョンは 2.0.7 です。

<properties>
    <powermock.version>2.0.7</powermock.version>
</properties>
于 2020-09-09T07:51:23.100 に答える
0

同様の問題があり、次のリンクを見つけました: 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>
于 2016-06-23T11:40:14.840 に答える
-2

一時的な修正として、JVM 引数に-noverifyを追加できます。ただし、どのリリースでもこれを使用しないでください。

于 2016-06-05T05:55:29.757 に答える