web-dev-qa-db-ja.com

ブランチ内からの不正な<init>メソッド呼び出し

JDKをJava7u65にアップグレードした後、MockitoおよびPowerMockを使用するいくつかの単体テストが次の原因で失敗し始めました。

15:15:23,807 INFO  - Tests in error: 
15:15:23,810 INFO  -   initializationError(com.your.ClassHere): Bad <init> method call from inside of a branch
22
Lauri

[〜#〜]更新[〜#〜]

この問題を修正する新しいJava7バージョンがあります。 Powermock/Javassistは、JDK 1.7.0u65および1.8.0u11に対して-target 7#525を指定して不正なコンストラクターを作成します

Java 7u71から7u75にアップグレードすると問題が修正されました

根本原因

調査したところ、JDKに基づいて構築されたすべてのツールと言語からインターネット全体から助けを求める叫びが聞こえました。

原因は新しいJava新しいベリファイアによってチェックされるバイトコード標準です。しかし、残念ながらjavassistpowermockを使用して、この新しい光沢のある非常に強力なものでは受け入れられないバイトコードへの変更を生成します。

回避策(新しいJavaを使用できない人向け)

JRebelブログ の回避策として、JVMの起動時に-noverifyフラグを使用することを提案しましたが、 Java 7 Bytecode Verifier:JVMの巨大な後方ステップ Java7で動作するブログ投稿の代替回避策:-XX:-UseSplitVerifier

テストはアクセスできないサーバーで実行され、Mavenビルドの一部として実行されるため、プロジェクトファイルと一緒にその引数を渡す方法を見つける必要がありました。私が発見した最初の実行可能な解決策は、このパラメーターをpom.xmlのsurefireプラグインの構成に次のように追加することです。

<build>
    <plugins>
        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.10</version>
            <configuration>
                <argLine>-XX:-UseSplitVerifier</argLine>
            </configuration>
        </plugin>
        <plugin>
    </plugins>
</build>

Java8では、同様のメソッドを使用して-noverifyキーでテストを呼び出すことができると思いますが、それを確認する機会がありませんでした。

監視するその他の関連リソース

Powermock/Javassistは-target 7を使用してJDK 1.7.0u65および1.8.0u11に対して不正なコンストラクターを作成しますPowermock/Javassistは-target 7を使用してJDK 1.7.0u65および1.8.0u11に対して不正なコンストラクターを作成します#525

48
Lauri

Java8でも同じ問題があり、-noverifyを使用して解決しました

6
Senaka

プロジェクトがjdk1.8.0_51でビルドされ、マシンにjdk1.8.0_11があったのと同じ問題がありました。 プロジェクトは、マシンでjdk1.8.0_51にアップグレードした後、正常に実行されます。

5