反映改变私有静态最终字段的值以进行单元测试

时间:2015-02-11 18:46:47

标签: java unit-testing reflection

我正在使用this回答中的以下代码段。

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();

        }

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

1 个答案:

答案 0 :(得分:0)

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

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

为什么要更改pi的定义?

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

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

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

你可能可以使用反射或更高级别的工具,如power mock,但它不是很方便,并且由于紧密耦合可能在将来表明问题