Java 如何模拟私有静态决赛
当使用Mockito和PowerMockRunner时,Java7和Java8会出现新的错误,当涉及静态final变量时,java会在字节码异常中抛出错误。这是由于现在更严格的字节码验证和模拟静态最终对象编辑字节码以成功模拟 我有一个我想模仿的班级:Java 如何模拟私有静态决赛,java,unit-testing,mockito,powermock,Java,Unit Testing,Mockito,Powermock,当使用Mockito和PowerMockRunner时,Java7和Java8会出现新的错误,当涉及静态final变量时,java会在字节码异常中抛出错误。这是由于现在更严格的字节码验证和模拟静态最终对象编辑字节码以成功模拟 我有一个我想模仿的班级: public class ClassToBeMocked { private static final int LIMIT_FROM_PROPERTIES = AnotherClazz.methodToRetrieveFromMap("St
public class ClassToBeMocked {
private static final int LIMIT_FROM_PROPERTIES = AnotherClazz.methodToRetrieveFromMap("String being called")
//more stuff
}
我已经看到,您可以通过使用反射来解决这个问题,这里和这里都可以看到(这不是一个很好的解决方案,但它应该可以工作)。然而,使用反射要求对象已经被实例化,我在尝试实例化ClassToBeMocked时遇到字节码异常
我还尝试在单元测试中模拟AnotherClazz.methodToRetrieveFromMap(字符串)(使用正确的语法):
但是,这会再次导致字节码错误
有没有一种方法可以绕过这个第22条军规,或者使用一个不同的框架或单元运行程序更好?我认为没有反思就无法做到这一点。 不管怎样,我认为如果您需要更改<代码>静态最终常量,您的设计可能有一些“错误”,尽管您只需要对测试范围进行修改。 正如您在问题中所说,有一些方法可以使用
PowerMock/EasyMock
,但它们仍然是反射
我会在其他答案中等待可能的备选方案。 < P>我建议您考虑将生产代码更改为静态使用和最终使用。这些都是众所周知的可测试性杀手。当您试图伪造这些构造时,您遇到的字节码操作问题是已知的问题
顺便说一句,确保您的PowerMock版本是最新的。还要确保您的Mockito版本与PowerMock匹配 经典是在嘲弄它的样子,也许它有眼镜,雀斑或其他东西,你可以嘲弄它。真的,这是很多即兴创作。(笑话)。另外,我认为这是一个复制品,我不觉得这是一个复制品,因为另一个问题的答案似乎是反射,我已经尝试过了。如果没有字节码错误,反射就可以工作。在PowerMock/EasyMock发布此错误的修补程序之前,理论上这是一个临时问题。
Mockito.when( AnotherClazz.methodToRetrieveFromMap("String being called") ).thenReturn(10);