Java 更新unittest基类中的私有静态final int

Java 更新unittest基类中的私有静态final int,java,unit-testing,reflection,Java,Unit Testing,Reflection,我尝试为单元测试更改私有静态final int的int值。 我看着 以及其他stackoverflow示例,如: 30秒是默认计时器。我想用setOverReflectionMax_SECONDS3设置它;到3秒。 但它不起作用,有什么提示吗 我的基础课 public class BaseClass { private static final int MAX_SECONDS = 30; } 和其他类 public final class MyClass extends BaseC

我尝试为单元测试更改私有静态final int的int值。 我看着 以及其他stackoverflow示例,如:

30秒是默认计时器。我想用setOverReflectionMax_SECONDS3设置它;到3秒。 但它不起作用,有什么提示吗

我的基础课

public class BaseClass {

    private static final int MAX_SECONDS = 30;

}
和其他类

public final class MyClass extends BaseClass {

    public static List<Field> getFields(final Class<?> clazz){
        final List<Field> list = new ArrayList<>();
        list.addAll(Arrays.asList(clazz.getDeclaredFields()));

        if(clazz.getSuperclass() != null){
            list.addAll(getFields(clazz.getSuperclass()));
        }
        return list;
    }

    public static void setOverReflectionMax_SECONDS(final int newValue) {

        final List<Field> fields = getFields(MyClass.class);
        for (final Field field : fields) {
            if (field.getName().equals("MAX_SECONDS")) {

                field.setAccessible(true);   //EDIT 4 

                Field modifiersField;
                try {
                    modifiersField = Field.class.getDeclaredField("modifiers");
                    modifiersField.setAccessible(true);
                    modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
                    field.set(null, newValue);
                } catch (final Exception e2) {
                    e2.printStackTrace();
                }

            }
        }
    }

}

Edit4:请参阅代码,修复了异常,但它不会更改int值,即使使用反射,这也可能不可能,因为字段的值可能由编译器内联。我相信编译器可以自由选择是否执行此操作。在这种情况下,值的副本将在实际使用的位置进行硬编码,并且只能通过操纵字节码进行更改

此问题对此进行了更详细的解释:

tl,dr:使用反射无法可靠地改变静态最终场。你的选择是:

操纵字节码是一个相当绝望的选择 查找另一个解决方案子类、包装器、代理。。。 bug作者更改源代码,使值可设置/可配置
为什么不暂时手动修改变量,然后重新运行单元测试呢?简单地更改最后一个变量进行测试似乎需要做很多工作。我只有.class,没有.java,所以我不能更改它。如果您不能更改它,为什么要更改它进行单元测试?其次,我假设您从中得到一个异常?那是什么样子?@tier1他没有例外;由于常量的内联,更改完全无效。谢谢!我会等到明天,如果有人让它工作,如果没有,我会接受你的答案
Class MyClass can not access a member of class BaseClass with modifiers "private static"