web-dev-qa-db-ja.com

MockClassLoaderがjdk / internal / reflectスーパークラスjdk.internal.reflect.MagicAccessorImplにアクセスできない

プロジェクトをJava9に移行している最中です。新しいJava=バージョンに切り替えた後、テストが失敗し始めます。PowerMockがアクセスできないクラスにアクセスしようとしているようです。

Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.973 sec <<< FAILURE! - in com.Test
initializationError(com.Test)  Time elapsed: 0.007 sec  <<< ERROR!
org.objenesis.ObjenesisException: Java.lang.reflect.InvocationTargetException
Caused by: Java.lang.reflect.InvocationTargetException
Caused by: Java.lang.IllegalAccessError: class jdk.internal.reflect.ConstructorAccessorImpl loaded by org/powermock/core/classloader/MockClassLoader cannot access jdk/internal/reflect superclass jdk.internal.reflect.MagicAccessorImpl

maven-surefire-plugin

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.19.1</version>
    <configuration>
        <includes>
            <include>**/*Test.Java</include>
            <include>**/*Test.groovy</include>
            <include>**/*Spec.*</include>
        </includes>
        <forkMode>always</forkMode>
        <argLine>--add-modules Java.xml.bind</argLine>
        <argLine>--add-modules Java.activation</argLine>
        <argLine>--add-opens=Java.base/Java.lang=ALL-UNNAMED --illegal-access=warn</argLine>
    </configuration>
</plugin>

powermock依存関係

<dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4</artifactId>
        <version>1.7.4</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-mockito</artifactId>
        <version>1.7.4</version>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.mockito</groupId>
                <artifactId>mockito-all</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
11
Saif Masadeh

これは(現在) 未解決の問題@powermock ですが、Java 9の場合、これは機能するはずです。

<dependency>
  <groupId>org.mockito</groupId>
  <artifactId>mockito-core</artifactId>
  <version>2.18.0</version> <!-- or higher, correspondning to powermock-version -->
</dependency>
<dependency>
  <groupId>org.powermock</groupId>
  <artifactId>powermock-api-mockito2</artifactId>
  <version>2.0.0-beta.5</version> <!-- or higher -->
</dependency>
<dependency>
  <groupId>org.powermock</groupId>
  <artifactId>powermock-module-junit4</artifactId>
  <version>2.0.0-beta.5</version> <!-- or higher -->
</dependency>

参照: https://github.com/powermock/powermock/issues/901#issuecomment-385533096


Java 11、 Mosheer-Ahmad を使用して、次のようにテストを実行できました:

  1. 上記の依存関係、
  2. org.javassist javassist 3.24.1-GA testへの追加の依存関係
  3. この(テストベース)クラス/注釈:

    @RunWith(PowerMockRunner.class)
    @PowerMockIgnore({"javax.management.", "com.Sun.org.Apache.xerces.", 
      "javax.xml.", "org.xml.", "org.w3c.dom.",
      "com.Sun.org.Apache.xalan.", "javax.activation.*"})
    public class PowerMockitoBaseRunner {
    
    }
    

11
xerx593

私はpowermockを使用するサードパーティのjarにテスト依存関係がありました。このエラーを解決するために、以下を追加する必要がありました。

@PowerMockIgnore("jdk.internal.reflect.*")

powermockでテストされるクラスへ

6
smac89

@ smac89が言及したように、私がしなければならなかったすべては問題のあるパッケージを無視することです。

テストクラスに@PowerMockIgnore("jdk.internal.reflect.*")の注釈を付ける

私のMaven依存関係は次のとおりです。

    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4</artifactId>
        <version>1.7.4</version>
        <scope>test</scope>
      </dependency>
    <dependency>
      <groupId>org.powermock</groupId>
      <artifactId>powermock-api-mockito</artifactId>
      <version>1.7.4</version>
      <scope>test</scope>
    </dependency>

Javaバージョン:

Java -version
openjdk version "11.0.1" 2018-10-16
OpenJDK Runtime Environment 18.9 (build 11.0.1+13)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.1+13, mixed mode)
0
DaddyMoe

Sghaier ALiによって作成された非常に優れた点を繰り返します。

無視されたクラスに*を追加すると、問題が解決しました。

行われる変更は次のとおりです。

  • Build.gradleの次の依存関係:
    testImplementation 'org.mockito:mockito-core:3.3.3'
    testImplementation 'org.powermock:powermock-api-mockito2:2.0.5'
    testImplementation 'org.powermock:powermock-module-junit4:2.0.5'

  • 特定のクラスに次の注釈を付ける:
    @ PowerMockIgnore({"javax.management ."、 "com.Sun.org.Apache.xerces。"、 "javax.xml ."、 "org。 xml。 "、" org.w3c.dom ."、" com.Sun.org.Apache.xalan。 "、" javax.activation。* "})

0
Rajesh Goel