我在测试中使用 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 的基本需求,但是......我正在调整现有代码,我突然对此感到困惑。
由于为每个测试方法创建了一个新的
FooTest
实例(不确定这对于 JUnit 来说是否 always 是正确的,但我认为在典型情况下至少是正确的),你将得到一个新的FileSystem
对于每个测试也是如此,除非您将该字段设为 static
。因此,无需删除测试后创建的文件。不过,您可能想要做的是每次测试后的 close()
FileSystem
。这会立即将其从打开的文件系统映射中删除,从而允许对其进行垃圾收集。 (这并不是绝对必要的,因为文件系统存储在弱引用中,但我认为无论如何这是更好的选择。)
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
}
}