当前位置:网站首页>JUnit 5测试中的临时目录(附实例及代码)
JUnit 5测试中的临时目录(附实例及代码)
2022-07-30 19:33:00 【JAVAQXQ】
JUnit 4 TemporaryFolder @Rule 允许开发人员利用临时目录来创建测试。在JUnit 5中,不支持 @Rule s,因此测试文件和目录需要一点额外的工作。幸运的是,在JUnit 5.4中,有一个新的内置扩展来处理测试中的临时目录,而且它非常容易使用:
你还在用JUnit 4工作吗?请看我以前的文章: 在JUnit 4中用TemporaryFolder @Rule测试文件和目录 。
@TempDir
@org.junit.jupiter.api.io.TempDir 注解可以用来注解类字段或生命周期中的参数(例如: )或测试方法的类型 或 。一旦这样做了,临时目录就会被创建。一旦测试方法或类执行完毕,该目录及其在测试执行过程中创建的内容将被删除。 @BeforeEach File Path
要测试的代码
在这个简单的例子中,我们将测试 FileWriter 类,它有一个单一的方法将文本内容写入一个新文件:
public class FileWriter {
public void writeTo(String path, String content) throws IOException {
Path target = Paths.get(path);
if (Files.exists(target)) {
throw new IOException("file already exists");
}
Files.copy(new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8)), target);
}
}
复制代码@TempDir 作为测试方法的参数
在这个例子中,我们将用 @TempDir 注释来测试参数:
import org.junit.jupiter.api.io.TempDir;
@Test
void writesContentToFile(@TempDir Path tempDir) throws IOException {
// arrange
Path output = tempDir
.resolve("output.txt");
// act
fileWriter.writeTo(output.toString(), "test");
// assert
assertAll(
() -> assertTrue(Files.exists(output)),
() -> assertLinesMatch(List.of("test"), Files.readAllLines(output))
);
}
复制代码@TempDir 作为一个实例字段
import org.junit.jupiter.api.io.TempDir;
class FileWriterTest {
private FileWriter fileWriter = new FileWriter();
@TempDir
Path tempDir;
@BeforeEach
void beforeEach() {
assertTrue(Files.isDirectory(this.tempDir));
}
@RepeatedTest(3)
void throwsErrorWhenTargetFileExists() throws IOException {
// arrange
Path output = Files.createFile(
tempDir.resolve("output.txt")
);
// act & assert
IOException expectedException = assertThrows(IOException.class, () -> fileWriter.writeTo(output.toString(), "test"));
assertEquals("file already exists", expectedException.getMessage());
}
}
复制代码基于上述例子,我们可以看到,每次重复测试都会使用一个新的临时目录(根据标准测试类的生命周期),因此方法的安排部分执行起来没有任何错误。
共享 @TempDir
如果需要在测试方法之间共享一个临时目录,我们可以创建一个静态字段并重复使用临时目录,如下面的例子:
import org.junit.jupiter.api.io.TempDir;
class FileWriterTest {
private FileWriter fileWriter = new FileWriter();
@TempDir
static Path tempDir;
@BeforeAll
static void setUp() {
assertTrue(Files.isDirectory(tempDir));
}
@RepeatedTest(3)
void throwsErrorWhenTargetFileExists(RepetitionInfo repetitionInfo) throws IOException {
// arrange
Path output = Files.createFile(
tempDir.resolve(repetitionInfo.getCurrentRepetition() + "_output.txt")
);
// act & assert
IOException expectedException = assertThrows(IOException.class, () -> fileWriter.writeTo(output.toString(), "test"));
assertEquals("file already exists", expectedException.getMessage());
}
}
复制代码请注意,测试方法的安排部分在每次执行时创建唯一的文件名(使用当前的重复计数器),否则 FileAlreadyExistsException 。
总结
通过 @TempDir ,你可以在测试中轻松地处理临时目录。这里没有魔法:你注解 Path 或 File 对象,并在你需要时注入。其余的由JUnit为你处理。
在GitHub上找到这些例子 :https://github.com/kolorobot/junit5-samples/tree/master/junit5-built-in-extensions
参见
边栏推荐
- Correct pose of Vulkan open feature
- The advanced version of the Niu Ke brushing series (team competition, sorting subsequences, inverting strings, deleting common characters, repairing pastures)
- coming!Dongfang Selection brings goods to the live broadcast of Longjiang agricultural products
- Day31 LeetCode
- What is a RESTful API?
- VS Code 连接SQL Server
- ImportError: attempted relative import with no known parent package
- 来了!东方甄选为龙江农产品直播带货
- 牛客网——华为题库(100~108)
- Linux download and install mysql5.7 version tutorial the most complete and detailed explanation
猜你喜欢

Spark学习:用spark实现ETL

MySQL函数(经典收藏)

牛客刷题系列之进阶版(组队竞赛,排序子序列,倒置字符串, 删除公共字符,修理牧场)

Linux下安装MySQL教程

【MindSpore】用coco2017训练Model_zoo上的 yolov4,迭代了两千多batch_size之后报错,大佬们帮忙看看。

Win11如何更改默认下载路径?Win11更改默认下载路径的方法

技术很牛逼,还需要“向上管理”吗?

Linux下安装Mysql5.7,超详细完整教程,以及云mysql连接

ERROR 1045 (28000) Access denied for user 'root'@'localhost'Solution

VBA runtime error '-2147217900 (80040e14): Automation error
随机推荐
ERROR 1045 (28000) Access denied for user ‘root‘@‘localhost‘解决方法
MindSpore:mindspore有没有类似tf.GradientTape()用来求解梯度的?
VS Code connects to SQL Server
Brush questions record----string
跨进程启动后台服务
技术很牛逼,还需要“向上管理”吗?
MySQL mass production of data
试写C语言三子棋
[PyTorchVideo Tutorial 01] Quickly implement video action recognition
win2003下FTP服务器如何搭建
Start foreground Activity
Cesium loads offline maps and offline terrain
linux下mysql8安装
Correct pose of Vulkan open feature
云数据库和本地数据库有什么区别?
Install Mysql5.7 under Linux, super detailed and complete tutorial, and cloud mysql connection
ELK日志分析系统
VBA connects Access database and Excel
【MindSpore】多卡训练保存权重问题
Spark学习:编译Spark项目时遇到的报错