当前位置: 首页 > 知识库问答 >
问题:

MockClassLoader无法访问jdk/内部/反映超类jdk.internal.reflect.MagicAccessorImpl

酆鸿彩
2023-03-14

我正在将一个项目迁移到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>
    <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>

共有3个答案

葛承嗣
2023-03-14

只是为了重申sghaier ali提出的非常好的观点。

将*添加到被忽略的类解决了这个问题。

所做的更改包括:

>

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.*"})
姬英耀
2023-03-14

这是一个(当前)开放的问题@powermock,但对于Java9,这应该有效:

<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

Java11,Mosheer-Ahmad设法运行了他的测试,其中:

>

@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 {

}

.

林俊晖
2023-03-14

我对使用powermock的第三方jar有测试依赖性。为了解决这个错误,我必须补充:

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

到使用powermock测试的类

 类似资料:
  • 我在使用reflections api的公共类中的私有类中使用私有方法时遇到问题。下面是一个简化的代码示例: 同样,我希望能够实例化一个类对象,然后从私有类调用。我一直试图通过反射来做到这一点,但我似乎无法超过1级。此外,内部类可能有也可能没有大多数代码似乎使用的构造函数。上面的代码只是框架。 我当前的代码: 我查找了各种方法来获取内部类或私有方法,但找不到在不使用构造函数的情况下将外部对象获取到

  • 因此,我正在构建一种基于对象的模型方法,并试图将所有现有的jQuery转换为纯JavaScript调用,但我遇到了一些问题。 所以我有一个基本的基础: 由于某些原因,当使用jQuery调用时,它都运行得很好,但是当使用Document.QuerySelector调用JS替代项时,我会得到一个错误,如下所示: 谁能给我解释一下.find()调用和传统JS的主要区别是什么?

  • 问题内容: 通读“用Java思考”,我陷入了《内部类》一章的ex:6。 练习6:(2)在自己的程序包中使用至少一种方法创建一个接口。在单独的程序包中创建一个类。添加一个实现该接口的受保护的内部类。在第三个包中,从您的类继承,并在方法内部,返回受保护的内部类的对象,并在返回期间向上转换到接口。 这是我的代码: IOne.java 接口 COne.java 具有实现接口的受保护内部类的类 CTwo.j

  • 问题内容: 如何从内部类访问外部类? 我正在重写一种使它在不同线程上运行的方法。从内联线程中,我需要调用原始方法,但是当然只要调用就会变成无限递归。 具体来说,我在扩展BufferedReader: 这个地方给了我我找不到的NullPointerException。 谢谢。 问题答案: 像这样: 上面的测试在执行时显示:

  • 问题内容: 我有一个班和一个子班 好的,在05行中,id喜欢访问A类的方法测试。但是我陷入了循环,因为我不知道如何指定使用A类的方法。 有任何想法吗? 问题答案: 编辑:正如@Thilo提到的:避免在外部类和内部类中使用相同的方法名称,这将避免命名冲突。

  • 我正在做下面这样的事情,但它不起作用。为什么?又是如何做到的呢?