微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何为DirectoryStream编写JUnit测试

如何解决如何为DirectoryStream编写JUnit测试

我在名为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

解决方法

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

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

如果需要获取临时目录路径的值,则只需在带有toString()注释的字段上调用@TempDir

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

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目录。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。