我正在使用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
的一部分。(pathToFile
是MyClass
中的私有静态最终字段。)
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();
}
另外,正是这样做,正确的方法来对私有静态最终字段进行单元测试吗?任何意见/建议/链接赞赏。
答案 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,但它不是很方便,并且由于紧密耦合可能在将来表明问题