每次测试后我都必须清理我的 Jimfs 文件系统吗?

问题描述 投票:0回答:2

我在测试中使用 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
  }
}

现在,我们知道 Jimfs 位于内存中。我真的需要清理我创建的路径还是可以删除

@After
方法(及其相关机制)?

我显然认为这是创建 jimfs 的基本需求,但是......我正在调整现有代码,我突然对此感到困惑。

java jimfs
2个回答
3
投票

由于为每个测试方法创建了一个新的

FooTest
实例(不确定这对于 JUnit 来说是否 always 是正确的,但我认为在典型情况下至少是正确的),你将得到一个新的
FileSystem
对于每个测试也是如此,除非您将该字段设为
static
。因此,无需删除测试后创建的文件。不过,您可能想要做的是每次测试后的
close()
FileSystem
。这会立即将其从打开的文件系统映射中删除,从而允许对其进行垃圾收集。 (这并不是绝对必要的,因为文件系统存储在弱引用中,但我认为无论如何这是更好的选择。)


0
投票

对于 JUnit 5 上的内容,我创建了

jimfs-junit-jupiter
,这是 JUnit Jupiter
@TempDir
注释的扩展,用于创建基于 Jimfs 的临时目录,根据测试生命周期负责目录清理。

典型的测试类如下所示:

import io.github.scordio.jimfs.junit.jupiter.JimfsTempDirFactory;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;


class FooTest {

    @TempDir(factory = JimfsTempDirFactory.class)
    private Path tempDir;

    @Test
    void bar() {
      // test using tempDir
    }

}

或者,使用内置的

@JimfsTempDir
组合注释:

import io.github.scordio.jimfs.junit.jupiter.JimfsTempDir;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;

class FooTest {

    @JimfsTempDir
    private Path tempDir;

    @Test
    void bar() {
      // test using tempDir
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.