如何为 DirectoryStream 编写 junit 测试

Posted

技术标签:

【中文标题】如何为 DirectoryStream 编写 junit 测试【英文标题】:How to write junit test for DirectoryStream 【发布时间】:2021-02-03 05:43:41 【问题描述】:

我在一个名为 Test.java 的类中有这个函数,它包含;

public List<Path> getAllFoldersInTmp(String directory) throws IOException 
    final List<Path> files = new ArrayList<>();
    try (DirectoryStream<Path> stream = Files.newDirectoryStream(Path.of(directory))) 
        for (Path entry : stream) 
            if (Files.isDirectory(entry)) 
                files.add(entry);
            
        
    
    return files;

所以基本上它会将所有文件夹作为“../../tmp”路径中的列表返回。我想为它写一个测试,我就是这样做的,但它不起作用:

import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import org.junit.jupiter.api.Test;

class Testing
    
    @Autowired
    Test test;
    @TempDir
    Path directory;
    
    @Test
    public void givenDir_whenUsingDirectoryStream_thenListAllFiles() throws IOException 
    
        File fileOne = directory.resolve("file1").toFile();
        File fileTwo = directory.resolve("file2").toFile();
    
        System.out.println(test.getAllFoldersInTmp("../../Temp")); //since the fileone and fileTwo are stored in `Temp/someRandomNumber` directory
    
    

我收到以下错误;

 ..\..\Temp
java.nio.file.NoSuchFileException: ..\..\Temp

【问题讨论】:

【参考方案1】:

使用@TempDir 时,您可以不使用某些特定的硬编码路径(例如,代码片段中的"../../Temp")。

基本上,临时目录将由junit 自动为您创建。然后在测试中,您可以按照您想要的方式操作它,例如创建文件和目录。

如果您需要获取临时目录路径的值,您可以简单地在带有@TempDir注释的字段上调用toString()

例如,对于您的具体情况,可以编写以下测试:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;

import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;

import static org.junit.jupiter.api.Assertions.assertEquals;

class FoldersResolverTest 

    @TempDir
    Path directory;

    // assume FoldersResolver wrapps getAllFoldersInTmp 
    FoldersResolver foldersResolver = new FoldersResolver();

    @Test
    void directoriesAreFoundAndFilesAreSkipped() throws IOException 

        Path fileOne = directory.resolve("file1");
        Path fileTwo = directory.resolve("file2");
        Path directoryOne = directory.resolve("directory1");
        Path directoryTwo = directory.resolve("directory2");

        Files.createFile(fileOne);
        Files.createFile(fileTwo);
        Files.createDirectory(directoryOne);
        Files.createDirectory(directoryTwo);

        // note directory.toString() returns path to the temporary folder created by junit
        List<Path> actual = foldersResolver.getAllFoldersInTmp(directory.toString());

        List<Path> expected = List.of(directoryOne.getFileName(), directoryTwo.getFileName());
        assertEquals(expected, actual);
    

注意:一般来说,@TempDir 使用默认的系统临时文件目录y。这取决于操作系统,通常可以通过环境变量找到。例如,我系统上的TMPDIR 指向/tmp 目录。

【讨论】:

我对@TmpDir 有疑问如何将fileOne 放入FileInputStream?以下路径无法删除 能帮我吗***.com/questions/64712198/… 嗨@Catalina!我最近才注意到 cmets。在您发布的问题中添加了答案。

以上是关于如何为 DirectoryStream 编写 junit 测试的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Node.js 编写异步函数

如何为@KafkaListener 编写单元测试?

如何为循环编写异常?

如何为 Python socketserver 请求处理程序编写单元测试?

如何为类编写正确的描述方法?

如何为 Product* getProductFromID(std::string) 编写方法定义;