使用 Java7 构造模拟静态方法时出现 PowerMock 问题

PowerMock issue when mocking a static method with Java7 construct

我在使用 Java7.

编译的代码模拟静态测试时遇到问题

我正在使用注释对我的 jUnit 测试进行注释

 @RunWith(PowerMockRunner.class)
 @PrepareForTest(StaticClassToMock.class)

当 运行 我的测试并尝试用

模拟我的静态 class
PowerMockito.mockStatic(StaticClassToMock.class);

它returns

java.lang.VerifyError: JVMVRFY012 stack shape inconsistent [...]

如果在 StaticClassToMock 中,我通过替换 OR 中捕获的异常并将它们放在级联中来删除 Java7 构造,它工作正常。

我看到最后一个版本的Powemock(1.6.6)是用Java6编译的。

当 PowerMock 使用 Java6 编译时,我的问题是否与 Java7 构造有关?

谢谢

PowerMock 就是这样 - 欢迎使用它的奇怪错误。

第一个问题是 - 您使用的是 IBM JDK 吗?因为 IBM JDK 和 PowerMock 比 Oracle/OpenJDK 和 PowerMock 更 "bizarre"。

如果您进行一些搜索,就会发现很多潜在的提示:

  1. Code not working with Java7

无论如何,第一个答案是:如果 运行 您的 JVM 使用 -noverify 是否有任何不同,请尝试一下。

较长的答案:除非您正在测试无法更改的第 3 方代码;考虑...不要以让您求助于 PowerMock 的方式使用 static 代码。

你看,static 首先是良好 OO 设计的异常。应谨慎使用;因为它将很多直接耦合到您的代码中。简单地说:使用 static 是创建要测试的代码 hard/impossible 的一种简单方法!因此,如果可以选择更改您的代码,您可以先观看那些 videos 以了解如何创建 可测试 代码。然后您转向 PowerMock 的需要...将完全消失。

我个人的两分钱:我花了很多时间来寻找此类 PowerMock 问题。然后我们决定做不同的设计,只允许 static 内容,不会破坏我们的普通单元测试。从那时起,我们与 EasyMock 和 Mockito 一起生活得很好。不再需要 PowerMock;不再需要花费数小时来调试与我们的生产代码毫无关系的问题;但只有模拟框架。