有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何模拟私有静态final

java 7&;出现了新的错误;8当使用Mockito和PowerMockRunner时,当涉及到静态final变量时,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 PowerMock和这里的PowerMock: mock out private static final variable, a concrete example(这不是一个很好的解决方案,但它应该可以工作)。然而,使用反射要求对象已经被实例化,我在尝试实例化ClassToBeMocked时遇到字节码异常

我还试着嘲笑另一个克拉兹。单元测试中的methodToRetrieveFromMap(字符串)(使用正确的语法):

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

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

有没有一种方法可以绕过这个第22条军规,或者使用一个不同的框架或单元运行程序


共 (2) 个答案

  1. # 1 楼答案

    我认为没有反思就无法做到这一点。 不管怎样,如果你需要改变^ {CD1}}常量,我认为你的设计可能有一些“错误”,尽管你只需要对测试范围进行修改。p>

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

    我将等待其他答案中可能的替代方案

  2. # 2 楼答案

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

    顺便说一句,确保你的PowerMock版本是最新的。还要确保您的Mockito版本与PowerMock匹配You can find PowerMock version matrix here.