【问题标题】:PowerMock issue when mocking a static method with Java7 construct使用 Java7 构造模拟静态方法时出现 PowerMock 问题
【发布时间】:2016-11-22 14:07:04
【问题描述】:

我在使用 Java7 编译的代码模拟静态测试时遇到问题。

我正在使用注释来注释我的 jUnit 测试

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

在运行我的测试并尝试使用

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

返回

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

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

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

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

谢谢

【问题讨论】:

    标签: mockito java-7 powermock java-6 verifyerror


    【解决方案1】:

    这就是 PowerMock 的特点 - 欢迎来到它的奇怪错误。

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

    如果你做一些搜索,周围有很多潜在的提示:

    1. VerifyError on WAS
    2. Code not working with Java7

    无论如何,第一个答案是:只要尝试使用 -noverify 运行 JVM 是否有任何不同。

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

    你看,static首先是好的OO设计的异常。应该非常小心地使用它;因为它将很多直接耦合到您的代码中。简单地说:使用 static 是创建难以/不可能测试的代码的一种简单方法!因此,如果可以选择更改代码,您可以观看videos 以了解如何首先创建可测试 代码。然后,您对 PowerMock 的需求就会消失。

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

    【讨论】:

    • 感谢您对 GhostCat 的解释,我完全同意您关于静态代码和 IBM JDK 的观点。不幸的是,我正在扩展 IBM 代码,并且无法修改现有代码。无论如何,我设法解决了这个问题:这是因为一个 oldjavassist 库。将其升级到较新的解决了我的问题。非常感谢!
    猜你喜欢
    • 2016-12-05
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    相关资源
    最近更新 更多