junit5_JUnit 5测试中的临时目录

news/2024/7/10 1:38:13 标签: java, python, linux, git, vue
junit5

junit5

JUnit 4 TemporaryFolder @Rule允许开发人员使用临时目录创建测试。 使用JUnit 5时,不支持@Rule因此测试文件和目录需要一点点额外的工作。 幸运的是,有了JUnit 5.4,有一个新的内置扩展可以处理测试中的临时目录。 而且它非常易于使用。

您还在使用JUnit 4吗? 请参阅我以前的有关使用TemporaryFolder @Rule在JUnit 4中测试文件和目录的文章。

@TempDir

可以使用@org.junit.jupiter.api.io.TempDir注释来注释类字段或生命周期中的参数(例如@BeforeEach )或FilePath类型的测试方法。 完成此操作后,将创建临时目录。 一旦测试方法或类执行完毕,将删除在测试执行过程中创建的目录及其内容。

要测试的代码

在这个简单的示例中,我们将测试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);

    }
 }

@TemDir作为测试方法参数

在此示例中,我们将使用@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());

    }
 }

根据上面的示例,我们可以看到测试的每次重复都使用一个新的临时目录(根据标准测试类生命周期),因此该方法的ranging部分执行无误。

共享的临时目录

如果需要在测试方法之间共享一个临时目录,我们可以创建一个静态字段并重用该临时目录,如下例所示:

 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会在每次执行时(使用当前的重复计数器)创建唯一的文件名,否则会抛出FileAlreadyExistsException

概要

使用@TempDir您可以轻松地在测试中使用临时目录。 这里没有魔术:您可以注释PathFile对象并根据需要进行注入。 其余的工作由JUnit替您完成。

在我的GitHub存储库中找到示例: https : //github.com/kolorobot/junit5-samples/tree/master/junit5-built-in-extensions

翻译自: https://www.javacodegeeks.com/2019/03/temporary-directories-junit-5-tests.html

junit5


http://www.niftyadmin.cn/n/1707597.html

相关文章

JUnit 5中的测试执行顺序

一般实践认为,自动化测试应能够独立运行且无特定顺序,并且测试结果不应依赖于先前测试的结果。 但是在某些情况下,可以证明特定的测试执行顺序是正确的,尤其是在集成或端到端测试中。 默认情况下,在JUnit 5中&#xff…

低代码学习教程:智能助手-编辑数据

智能助手-编辑数据 文档以表单属性-表单提交数据这个安装入口介绍模块的使用及效果。 智能助手-编辑数据的安装入口有五个:表单属性——表单提交数据、表单属性——表单删除数据、表单属性——表单编辑数据、报表菜单——功能模块、数据表菜单。 根据安装的位置不同…

利用企业微信+百数,疫苗接种信息搜集更有效

6 月初,随着企业微信 3.1.8 版本的到来,朋友圈的发布条数正式从每天 1 条提升至每天 3 条。对于社区医院系统,可以将疫苗实时信息,季节疾病防治措施,体检活动报名等信息更多通过朋友圈发布,帮助医院和社康中…

win10安装macos10.13成功经验(2020,4月)

昨天看了许多之前的博客,看了几篇好用的,小结一下,感谢大佬让我体验了mac,虚拟机上运行,确实吃内存,并不是太流畅,但是也能满足我搞机的快乐了。 安装全过程: win10安装macos10.13 …

教你一招:如何快速制作来访登记二维码?

新冠肺炎疫情防控工作中至今,联防联控变成了避免 人员流动性的最关键方式,外界人员登记、追朔也是头等大事。“一个本子、一支笔“的登记方式在多地早已变成“过去式”,二维码变成了住宅小区来访人员登记的一张新个人名片。 自联防联控工作中…

Java学习笔记20(流Stream到底有哪些)

文章目录0.本篇摘要1.缓冲流1.1缓冲字节流1.2缓冲字符流2.转换流2.1转换输入流(字节->字符)2.2转换输出流(字节->字符)3.标准输入输出流3.1标准的输入流4.对象流5.RandomAccessFile 类随机读随机写0.本篇摘要 字节流-缓冲流…

夸克浏览器_关于夸克的思考

夸克浏览器Quarkus,新的“超音速,亚原子” Java框架目前正受到广泛关注。 对于企业Java的未来而言,此构建和运行时工具背后的思想确实比我们感兴趣。 使用Quarkus有什么好处和缺点? 摆脱动力 Quarkus认为,在容器化的世…

教你一招:低代码开发平台实现抗疫物资管理系统的搭建

2019年末发生了全球性的公共卫生——新冠疫情,这次疫情给人类的生活带来了巨大的影响与威胁。纵观全球疫情,中国因其防控得当让疫情获得了很好都得控制,避免了大规模蔓延带来的伤害。经过近两年的“防疫之战”,全国上下都知道了疫…