在单元测试中,我正在覆盖配置文件以测试处理不良属性值。 我正在使用Apache Commons IO:
org.apache.commons.io.FileUtils.copyFile(new File(configDir, "xyz.properties.badValue"), new File(configDir, "xyz.properties"), false)
在调查文件系统时,我发现xyz.properties
实际上已被覆盖 - 尺寸已更新且内容与xyz.properties.badValue
的内容相同。
当我完成通过将文件读入Properties对象的代码(使用FileReader
对象)的测试用例时,我得到原始xyz.properties
文件的属性,而不是新复制的版本
通过调试我单步执行并调查文件,我可以排除这是写入文件系统的时间问题。
复制步骤是否以某种方式保存文件句柄?如果是这样,我将如何再次发布它? 如果没有,是否有人知道为什么会发生这种情况以及如何解决它?
感谢。
答案 0 :(得分:2)
如果您在此对象之前初始化了FileReader
对象,那么它将已经存储了旧版本的临时副本。
您需要重置它:
FileReader f = new FileReader("the.file");
// Copy and overwrite "the.file"
f = new FileReader("the.file");
在Unix文件系统模型中,只要有人在文件中打开inode
,或者有一个指向它的目录条目,包含文件内容的filehandle
就会一直存在。
替换目录中文件的名称,不会删除inode
(文件内容),因此可以继续使用已打开的filehandle
。
这实际上可用于创建永远不需要清理的临时文件:创建文件,然后立即取消链接,同时保持打开状态。关闭文件句柄时,会收到inode
答案 1 :(得分:1)
我意识到这并没有直接回答你的问题,但我认为最好维护两个单独的文件,并安排你的代码在运行时配置/注入配置文件的名称。这样,您的测试可以指定要使用的配置文件,而不是覆盖单个文件。