我们在一些历史项目中使用了PowerMock。不幸的是,PowerMock相当过时,并且与Java 11不兼容。
我们正在使用mockStatic()。是的,我们知道它被认为是有害的——它在遗留代码中,我们希望现在不要重写那些类...
有没有什么选项可以调整PowerMock以支持Java 11?或者是否可以轻松地用其他Java 11兼容框架替换它?(Mockito不支持mockStatic)
我们在一些历史项目中使用了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.*")
不需要其他的。你可以像这个例子一样,在测试类的顶部与其他注释一起放置它:
@RunWith(PowerMockRunner.class)
@PowerMockIgnore("jdk.internal.reflect.*")
@PrepareForTest({ File.class, FileSystemUtils.class })
public class MyTest {
...
}
从mockito版本3.4.0开始,可以模拟静态方法。您可以参考https://www.baeldung.com/mockito-mock-static-methods获取更多信息。
添加属性: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.*
powermock.global-ignore=com.sun.org.apache.xerces.*,javax.xml.*,org.xml.*,org.w3c.*
--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 introduce