什么';java单元测试的一个好模式是什么,可以确保正确关闭文件?

什么';java单元测试的一个好模式是什么,可以确保正确关闭文件?,java,file-io,resource-leak,Java,File Io,Resource Leak,我的代码库中有一个问题,我们没有正确地关闭文件句柄,或者可能是流。我们最终在非常重的负载下得到一个TooManyOpenFiles异常。基于lsof的输出,我们非常确定我们知道泄漏在哪里(在我们的日志系统中),但我的问题是:我如何编写一个单元测试,在完成后检查资源是否已正确关闭?有没有办法查询JRE以了解当前打开了多少文件?我可以拦截文件操作以便监视它们吗 我怀疑我将不得不插入代码以管理所有文件I/O、计算引用并确保它们以这种方式关闭,但是如果有人知道类似于我上面提到的那些想法的自上而下的解决方

我的代码库中有一个问题,我们没有正确地关闭文件句柄,或者可能是流。我们最终在非常重的负载下得到一个TooManyOpenFiles异常。基于lsof的输出,我们非常确定我们知道泄漏在哪里(在我们的日志系统中),但我的问题是:我如何编写一个单元测试,在完成后检查资源是否已正确关闭?有没有办法查询JRE以了解当前打开了多少文件?我可以拦截文件操作以便监视它们吗


我怀疑我将不得不插入代码以管理所有文件I/O、计算引用并确保它们以这种方式关闭,但是如果有人知道类似于我上面提到的那些想法的自上而下的解决方案,那将是一个巨大的帮助

您可以使用面向方面编程(AOP)工具,如添加代码,以将打开/关闭的文件计数到
FileInputStream
FileOutputStream
。这是相当容易做到的(细节当然取决于工具),健壮且无创。

看起来您可以通过JMX观看

有人在这里发布代码:


如果您还没有在JVM中启用JMX,那么您必须在JVM中启用JMX。

因为您正在谈论测试,PowerMock可能会做到这一点。如果我没有弄错的话,可以模拟静态方法和构造函数。因此,您可以模拟/监视构造函数和close方法,或者释放资源所需的任何东西


我试着在测试中避免它,但在您描述的情况下,这可能是值得的。

我相信Java在后台完成了所有这些,所以应该注意它。嗯,也许我没想到Java最终会垃圾收集并关闭你打开的文件,但如果你很快打开并扔掉资源,它就跟不上了。显式关闭句柄要好得多。我认为当您考虑更改您的构建链非侵入性时,AspectJ才是非侵入性的。这是一个测试——用AspectJ构建将是测试的一部分。是的,这似乎比我想添加到这个相当低的库代码中更像是一个很好的操作方法。但我不认为它可以作为单元测试使用。我认为这个答案是正确的,因为它在精神上与我所寻找的最接近,但在我的情况下,我最终选择不编写单元测试。只是使用lsof来验证文件在我的补丁之前没有关闭,而在补丁之后关闭。