PowerMock与Java 11

33

我们在一些历史项目中使用了PowerMock。不幸的是,PowerMock相当过时,并且与Java 11不兼容。

我们正在使用mockStatic()。是的,我们知道它被认为是有害的——它在遗留代码中,我们希望现在不要重写那些类...

有没有什么选项可以调整PowerMock以支持Java 11?或者是否可以轻松地用其他Java 11兼容框架替换它?(Mockito不支持mockStatic)


2
点击那个 GitHub 链接,它显示最后一次提交是2天前... - Kevin Van Dyck
1
很可能是由管理EasyMock集成的人制作的... Powermock的最后一个发布已经超过一年了,是一个补丁发布。上一个小版本已经超过2年了。关于版本2的GitHub问题从未得到回复等等... - malejpavouk
3
附带说明:PowerMock是一个强大的工具,但我强烈建议只把它当作最后的手段使用。如果你可以迁移到不需要模拟静态成员的更易于测试的设计,那么你就可以减少对PowerMock的依赖,并且使你的代码在长期维护中更容易维护。 - Daniel Pryden
是的,我完全同意。mockStatic()等等真的是一个糟糕的想法... - malejpavouk
1
2019年4月21日:PowerMock 2.0.2已发布,所以它还没有死,感觉好多了。不过它仍然不支持JUnit 5。 - ThatAintWorking
Java9:https://dev59.com/S1UL5IYBdhLWcg3wYHDD - xerx593
7个回答

27

经过一年的停更,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 下运行正常。


我同意你所说的一切。不过,对于那些离不开PowerMock的人来说,这可能是有帮助的信息。 - GhostCat
2
那个解决方法似乎只有有限的成功。在许多情况下它不起作用。<br>请参见:https://github.com/powermock/powermock/issues/1061 <br>这个也有时会起作用:<br> @PowerMockIgnore({"javax.net.ssl.", "org.slf4j.", "javax.parsers.", "ch.qos.logback.", "jdk.xml.internal.", "com.sun.org.apache.xerces.", "javax.xml.", "org.xml.", "javax.management.*"}) - rakehell

17

解决方案:

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

不需要其他的。你可以像这个例子一样,在测试类的顶部与其他注释一起放置它:

@RunWith(PowerMockRunner.class)
@PowerMockIgnore("jdk.internal.reflect.*")
@PrepareForTest({ File.class, FileSystemUtils.class })
public class MyTest {
   ...
}

谢谢。同时也解决了 Android 的问题。 - arturvt
1
如果有人仍然遇到麻烦,这个技巧对于Mockito 1.7.0 + PowerMock 1.7.0项目对我奏效了。 - satrioaditya
在哪里添加这个注解? - Qadir Hussain
在测试类的顶部,我更新了我的答案,希望有所帮助。 - Bruno Bossola

3

2

添加属性: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.*

请注意,在configuration.properties文件中不允许使用空格和双引号。详情请参见:https://github.com/powermock/powermock/issues/989 - Navigatron

2
如果有很多测试类需要迁移到Java 11,可以全局配置忽略项(只需在配置文件中进行一次):org/powermock/extensions/configuration.properties。
powermock.global-ignore=com.sun.org.apache.xerces.*,javax.xml.*,org.xml.*,org.w3c.*

请注意,configuration.properties文件中不允许使用空格和双引号。详见:https://github.com/powermock/powermock/issues/989 - Navigatron

1
如果您正在使用Java 11,则将依赖项org.power.mock降级为1.7.0。

问题已解决,谢谢。 - undefined

1
如果在JDK11中使用反射,您可能会看到一些警告,例如“已发生非法反射访问操作”,因为自JDK9以来,反射JDK内部API是非法的,但仍然可以在上面显示警告时使用它。
为了暂时解决问题,请尝试在您的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 introduce


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接