Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 每次测试后是否必须清理Jimfs文件系统?_Java_Jimfs - Fatal编程技术网

Java 每次测试后是否必须清理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

我在测试中使用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.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提供的文件系统?