1.概述

测试时,我们通常需要访问临时文件。但是,自己管理这些文件的创建和删除可能会很麻烦。

在本快速教程中,我们将了解JUnit5如何通过提供TempDirectory扩展来缓解这种情况.

有关使用JUnit进行测试的深入指南,请查看我们优秀的JUnit 5指南.

2.临时目录扩展名

从版本5.4.2开始,JUnit5提供了TempDirectory扩展实验的我们被鼓励向JUnit团队提供反馈。

我们稍后会看到,我们可以使用此扩展为单个测试或测试类中的所有测试创建和清理临时目录.

通常当使用扩展名,我们需要使用@延伸注释。但这对于内置并默认注册的TempDirectory扩展是不必要的。

3.Maven依赖项

首先,让我们添加示例所需的项目依赖项。

除了主要的JUnit5库之外朱尼特木星发动机我们还需要JUnitJupiter api图书馆:

org.junit.jupiterjunit-jupiter-api5.4.2test

一如既往,我们可以从马文中心酒店.

除此之外,我们还需要添加朱尼特朱庇特酒店附属国:

org.junit.jupiterjunit-jupiter-params5.4.2test

同样,我们可以在中找到最新版本马文中心酒店.

4.使用@坦普迪尔注释

为了使用TempDirectory扩展名,我们需要利用这个机会@坦普迪尔注释。我们只能将此批注与以下两种类型一起使用:

  • java.nio.file.Path
  • java.io.xml文件

事实上,如果我们尝试将它与其他类型一起使用,那么org.junit.jupiter.api.extension.ParameterResolutionException将被抛出。

接下来,让我们探讨使用此注释的几种不同方式。

4.1.@坦普迪尔作为方法参数

让我们先看看如何注入带注释的参数@坦普迪尔转化为单一的测试方法:

@Test void giventestmethodwhen writetofile_the contentiscorrect(@TempDir Path TempDir)抛出IOException{Path numbers=TempDir.resolve(“numbers.txt”);Listlines=Arrays.asList(“1”、“2”、“3”);Files.write(数字、行);assertAll(()->assertTrue(“文件应存在”,Files.exists(数字)),()->assertLinesMatch(行,文件。readAllLines(数字));}

如我们所见,我们的测试方法创建并写入一个名为number.txt在临时目录中坦普迪尔.

然后我们检查文件是否存在,以及内容是否与最初编写的内容相匹配。非常好而且简单!

4.2.@坦普迪尔在实例字段上

在下一个示例中,我们将使用@坦普迪尔注释:

@TempDir File anotherTempDir;@Test void givenFieldWithTempDirectoryFile_当写入文件时,contentiscorrect()抛出IOException{assertTrue(“应该是一个目录,this.anotherTempDir.isDirectory());File lets=new File(anotherTempDir,“lets.txt”);Listlines=Arrays.asList(“x”、“y”、“z”);Files.write(lets.toPath(),lines);assertAll(()->assertTrue(“文件应存在”,Files.exists(letters.toPath()),()->assertLinesMatch(lines,Files.readAllLines(letters.toPath()));}

这一次,我们使用java.io.xml文件再次,我们写了一些行并检查它们是否被成功写入。

如果我们在其他测试方法中再次使用这个引用,那么每个测试都将使用它自己的临时目录.

4.3.共享临时目录

有时候,我们可能想在测试方法之间共享临时目录.

我们可以通过声明字段来实现这一点静止的:

@TempDir静态路径sharedTempDir@当写入文件时,Test@Order(1)void givenfield with sharedTempdirectoryPath_contentiscorrect()抛出IOException{Path numbers=sharedTempDir.resolve(“numbers.txt”);Listlines=array.asList(“1”、“2”、“3”);Files.write(数字、行);assertAll(()->assertTrue(“文件应存在”,Files.exists(数字)),()->assertLinesMatch(lines,Files.readAllLines(numbers));}@Test@Order(2)void当CheckContents\u thenContentIsCorrect()抛出IOException时,为sharedTempDir.resolve(“numbers.txt”);assertLinesMatch(Arrays.asList(“1”、“2”、“3”),Files.readAllLines(numbers));}

这里的关键是我们使用一个静态场sharedTempDir这是两种测试方法的共同点.

在第一个测试中,我们再次向名为number.txt。然后,我们在下一次测试中检查文件和内容是否已存在。

我们还执行测试的顺序经由@命令注释以确保行为始终一致。

5.戈查斯

现在让我们回顾一下使用TempDirectory扩展时应该注意的一些细节。

5.1.创造

好奇的读者可能会想知道这些临时文件实际上是在哪里创建的?

嗯,在JUnit内部临时目录类使用Files.createTempDirectory(字符串前缀)方法同样,此方法随后使用默认的系统临时文件目录.

这通常在环境变量中指定TMPDIR:

TMPDIR=/var/folders/3b/rp7016xn6fz9g0yf5_nj71m00000gn/T/

例如,生成临时文件位置:

/var/folders/3b/rp7016xn6fz9g0yf5_nj71m00000gn/T/junit541670701666180307/numbers.txt

同时,如果无法创建临时目录,则ExtensionConfiguration异常将根据需要抛出。或者如前所述参数解析异常.

5.2.删除

当测试方法或类已完成执行且临时目录超出范围时,JUnit框架将尝试递归删除该目录中的所有文件和目录,最后是临时目录本身。

如果在此删除阶段出现问题,则IOException将被抛出,测试或测试类将失败。

6.结论

总之,在本教程中,我们探讨了JUnit5提供的TempDirectory扩展。

首先,我们从介绍扩展开始,了解了使用它需要哪些Maven依赖项。接下来,我们看了几个如何在单元测试中使用扩展的示例。

最后,我们查看了几个问题,包括临时文件的创建位置以及删除过程中发生的情况。

一如既往,本文的完整源代码是可用的在GitHub上.

通用底部

通过学春天课程:

>>查看课程
对本文的评论已关闭!