[英]PowerMock & Java 11
我们在少数历史项目中使用了 PowerMock。 不幸的是,PowerMock 已经死了,并且与 Java 11 不兼容。
我们正在使用 mockStatic()。 是的,我们知道它被认为是有害的——它在遗留代码中,我们现在不想重写这些类……
是否有任何选项可以调整 PowerMock 以支持 Java 11? 或者是否可以用其他一些 Java 11 兼容框架轻松替换它? (Mockito 不支持 mockStatic)
在一年没有发布之后,PowerMock 的事情真的发生了变化。
PowerMock 2.0.0-RC1 发布。 并使用 PowerMockito 2.0.0-RC1 + @PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "org.w3c.*"})
这些测试在 Java 11 下工作。
解决了:
@PowerMockIgnore("jdk.internal.reflect.*")
其他什么都不需要。
如果有很多测试类要迁移到 Java 11,则可以在 org/powermock/entensions/configuration.properties 文件中只配置一次忽略:
powermock.global-ignore=com.sun.org.apache.xerces.*,javax.xml.*,org.xml.*,org.w3c.*
添加属性:org/powermock/extensions/configuration.properties
https://github.com/powermock/powermock/wiki/PowerMock-Configuration https://github.com/powermock/powermock-examples-maven/blob/master/global-ignore/src/test/resources/org/powermock /extensions/configuration.properties
例如对于 maven/gradle:src/test/resources/org/powermock/extensions/configuration.properties
powermock.global-ignore=javax.crypto.*,com.sun.xml.internal.stream.*,javax.xml.stream.*,javax.net.ssl.*,org.slf4j.*,javax.xml.parsers.*,ch.qos.logback.*,jdk.xml.internal.*,com.sun.org.apache.xerces.*,java.xml.*,org.xml.*,javax.management.*,org.w3c.dom.*
从 mockito 3.4.0 版开始,可以模拟静态方法。 您可以参考https://www.baeldung.com/mockito-mock-static-methods了解更多信息。
如果您使用 java 11,则将依赖项 org.power.mock 降级到 1.7.0。
如果在 JDK11 中使用 reflect,你可能会看到类似 'An illegal reflective access operation has occurred' 的警告,因为 reflect JDK 内部 API 从 JDK9 开始是非法的,你仍然可以在上面的警告下使用它。
要临时解决问题,请尝试在您的 argLing 中使用--add-exports
或--add-opens
。
例如: --add-opens java.xml/jdk.xml.internal=ALL-UNNAMED
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M5</version>
<configuration>
<argLine>
@{argLine} --add-opens java.xml/jdk.xml.internal=ALL-UNNAMED
</argLine>
</configuration>
</plugin>
有关更多信息,请观看--add-opens 介绍
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.