2011-12-09 53 views
0

在单元测试中,我覆盖配置文件以测试处理不良属性值。 我使用Apache的百科全书IO:Java复制覆盖文件,读取时获取旧文件

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

复制方法适当关闭所有句柄;没有进一步的信息可能很难协助。你有一个可以重现错误的最小测试用例吗? –

回答

1

我意识到这并不直接回答你的问题,但我认为最好是维护两个单独的文件,并安排你的代码在运行时配置/注入配置文件的名称。这样,您的测试可以指定使用哪个配置文件,而不是覆盖单个文件。

2

如果您在此对象之前初始化了FileReader对象,则它将已经存储旧版本的临时副本。

你需要重新设置:

FileReader f = new FileReader("the.file"); 

// Copy and overwrite "the.file" 

f = new FileReader("the.file"); 

在Unix文件系统模型,包含文件的内容,只要有人有一个开放的filehandle到文件,或有一个目录将持续的inode指向它的条目。

在目录中替换该文件的,不会删除inode(该文件的内容),所以你已经开filehandle可以继续使用。

这实际上可以用来创建永不需要清理的临时文件:创建文件,然后立即取消链接,同时保持打开状态。当您关闭文件句柄时,inode收割

+0

...因为在Unix文件系统模型中,只要有人在文件中有一个打开的文件句柄,包含文件内容的'inode'就会一直存在,*或*有一个指向它的目录条目。在目录中替换文件的*名称*不会删除'inode'(文件的内容),因此您已经打开的文件句柄可以继续使用。这实际上可以用来创建永不需要清理的临时文件:创建文件,然后立即“取消链接”,同时保持打开状态。当你关闭文件句柄时,会获得'inode'。 – BRFennPocock