Java 每次测试后是否必须清理Jimfs文件系统?
我在测试中使用Jimfs,如下所示:Java 每次测试后是否必须清理Jimfs文件系统?,java,jimfs,Java,Jimfs,我在测试中使用Jimfs,如下所示: public class FooTest { private FileSystem fs = Jimfs.newFileSystem(Configuration.unix()); private List<Path> paths = new ArrayList<>(); private Path getPath(String first, String... more) { Path path = fs.getPa
public class FooTest {
private FileSystem fs = Jimfs.newFileSystem(Configuration.unix());
private List<Path> paths = new ArrayList<>();
private Path getPath(String first, String... more) {
Path path = fs.getPath(first, more);
paths.add(path);
return path;
}
@After public void cleanPaths() {
for (Path path: paths) {
Files.walkFileTree(path, FileVisitors.DELETE);
}
}
@Test public void bar() {
Path baz = getPath("baz");
// test using baz
}
}
public-class-FooTest{
私有文件系统fs=Jimfs.newFileSystem(Configuration.unix());
私有列表路径=新的ArrayList();
私有路径getPath(字符串优先,字符串…更多){
Path Path=fs.getPath(第一个,更多);
路径。添加(路径);
返回路径;
}
@在公共路径()之后{
用于(路径:路径){
walkFileTree(路径,FileVisitors.DELETE);
}
}
@测试公共空栏(){
路径baz=getPath(“baz”);
//使用baz进行测试
}
}
现在,我们知道Jimfs在内存中。我真的需要清理我创建的路径吗,还是可以删除@After
方法(及其相关机制)
我清楚地认为这是创建jimfs的基本需要,但是。。。我正在修改现有代码,突然对此感到困惑。因为为每个测试方法创建了一个新的
FooTest
实例(不确定JUnit是否总是这样,但我认为至少在典型情况下是这样),对于每个测试,您也将获得一个新的文件系统
,除非您将该字段设置为静态
。因此,没有必要删除测试后创建的文件。不过,您可能希望在每次测试后执行close()
文件系统。这会立即将其从打开的文件系统映射中删除,从而允许对其进行垃圾收集。(这并不是绝对必要的,因为文件系统存储在那里的弱引用中,但我认为无论如何都是比较可取的。)感谢close()
技巧,实际上很高兴知道,由于Junit在整个运行过程中默认保留测试实例的强引用。关于Junit本身,您有权怀疑每个测试一个实例的方法,因为它完全是由使用的运行程序定义的,即使默认的方法是每个测试一个实例。是的,因此,您可能希望使用@Before
和@Before
来创建/关闭文件系统
,以便正确地为JUnit执行所有操作。在某个时候,我可能会为Jimfs创建一个JUnit规则来为您实现这一点。@ColinD从性能的角度来看怎么样?创建JimFS文件系统是否昂贵?它如何处理WatchService的线程;如果不使用手表,就不会分配线程(从而保存~MB堆栈分配),这是不是很懒惰?您是否建议尝试通过执行类似于Files.delete(JimFS.getPath(“/”)
)的操作,在整个测试中重复使用JimFS提供的文件系统?