如何为 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 测试的主要内容,如果未能解决你的问题,请参考以下文章