如何模拟私有静态决赛

时间:2014-09-04 15:29:27

标签: java unit-testing mockito powermock

随着java 7& amp; 8当使用Mockito和PowerMockRunner时,如果涉及静态最终变量,Java将在字节代码异常中抛出错误。这是由于现在更严格的字节代码验证和模拟静态最终对象编辑字节代码以便成功模拟。

我正在尝试模拟以下课程:

public class ClassToBeMocked {
    private static final int LIMIT_FROM_PROPERTIES = AnotherClazz.methodToRetrieveFromMap("String being called")

    //more stuff
}

我已经看到你可以通过使用反射来解决这个问题,在这里看到How to mock a static final variable using JUnit, EasyMock or PowerMockPowerMock: mock out private static final variable, a concrete example(这不是一个很好的解决方案,但它应该有效)。但是,使用反射需要已经实例化对象,并且在尝试实例化ClassToBeMocked时我得到字节码异常。

我也尝试在单元测试中模拟AnotherClazz.methodToRetrieveFromMap(String)(使用正确的语法):

Mockito.when( AnotherClazz.methodToRetrieveFromMap("String being called") ).thenReturn(10);

但是,这会再次导致字节码错误。

有没有办法解决这个问题-22还是一个不同的框架或单元跑步者哪个更好用?

2 个答案:

答案 0 :(得分:0)

我认为没有反思就没有办法做到这一点。 无论如何,我认为如果你需要改变static final常数,你的设计中可能会出现“错误”,尽管你只需要测试范围。

正如你在问题中所说,有一些方法可以用PowerMock / EasyMock来做,但无论如何它们仍然是反射。

我会在其他答案中等待可能的替代方案。

答案 1 :(得分:0)

我建议您考虑将生产代码更改为avid use static和final。这些是众所周知的可测试性杀手。当您尝试伪造这些构造时,您遇到的字节码操作问题是已知问题。

BTW,确保您的PowerMock版本是最新的。还要确保您的Mockito版本与PowerMock匹配。 You can find PowerMock version matrix here.