繁体   English   中英

反射以更改用于单元测试的私有静态最终字段的值

[英]Reflection to change value of a private static final field for unit testing

我正在使用这个答案中的以下片段。

static void setFinalStatic(Field field, Object newValue) throws Exception {
    field.setAccessible(true);

    // remove final modifier from field
    Field modifiersField = Field.class.getDeclaredField("modifiers");
    modifiersField.setAccessible(true);
    modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);

    field.set(null, newValue);
}

这是调用上述方法的MyClassTest的一部分。( pathToFileMyClass的私有静态最终字段)。

public static void main (String ... args) {
        try{
            setFinalStatic(MyClass.class.getDeclaredField("pathtoFile"), "test-propFile.properties");
            System.out.println(MyClass.class.getDeclaredField("pathtoFile"));// prints the original value of pathToFile.
// how do I access the  modified value  pathToFile here?
        }
        catch(Exception e){
            e.printStackTrace();

        }

另外,这样做是对私有静态最终字段进行单元测试的正确方法吗? 任何评论/建议/链接表示赞赏。

你不测试常量。 您使用它们并测试使用它们的代码。

static final double pi = 3.14...
let calculate_circuit r = 2 pi r

为什么要更改pi的定义?

如果您需要测试具有不同值的代码,这意味着它不是常量而是配置。 那么你必须重构你的代码来解耦配置和使用它的代码:

mail.server = mail.myCompany.com
send_email(String mailServer) = ....

然后您可以使用不同的邮件服务器轻松测试send_email

您可能可以使用反射或更高级别的工具(如 power mock),但这不是很方便,并且由于紧耦合可能会在未来指出问题

暂无
暂无

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

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