[英]Using reflection to change static final File.separatorChar for unit testing?
[英]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
的一部分。( 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();
}
另外,这样做是对私有静态最终字段进行单元测试的正确方法吗? 任何评论/建议/链接表示赞赏。
你不测试常量。 您使用它们并测试使用它们的代码。
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.