繁体   English   中英

如何模拟私人静态决赛

[英]How to mock a private static final

使用Mockito和PowerMockRunner时,随着Java 7和8弹出新错误,当涉及到静态最终变量时,Java将在字节码异常中引发错误。 这是由于现在更加严格的字节码验证和模拟静态最终对象编辑了字节码以便成功进行模拟。

我尝试模仿以下课程:

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

    //more stuff
}

我已经看到您可以通过使用反射来解决此问题,请参见此处如何使用JUnit,EasyMock或PowerMock 模拟静态最终变量,以及此处的PowerMock:模拟出私有静态最终变量,这是一个具体示例 (不是很好的解决方案,但是应该管用)。 但是,使用反射要求对象已被实例化,并且在尝试实例化ClassToBeMocked时出现字节码异常。

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

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

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

是否有办法解决这个问题22或使用更好的其他框架或单元运行器?

我认为没有反思就没有办法。 无论如何,我认为如果您需要更改static final常量,则您的设计中可能存在“错误”,尽管您只需要在测试范围内使用即可。

正如您在问题中所说的那样,可以使用PowerMock / EasyMock进行某些操作,但是无论如何它们仍然会反映出来。

我将在其他答案中等待其他可能的选择。

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

顺便说一句,请确保您的PowerMock版本是最新的。 还要确保您的Mockito版本与PowerMock匹配。 您可以在此处找到PowerMock版本矩阵。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM