java - 具有删除目录方法的单元测试文件实用程序类
问题描述
我有一个带有 deleteDir 函数的文件实用程序类
@Override
public boolean deleteDir(File file) {
File[] contents = file.listFiles();
if (contents != null) {
for (File f : contents) {
if (! Files.isSymbolicLink(f.toPath())) {
deleteDir(f);
}
}
}
file.delete();
return true;
}
我有另一个类,它有一个调用文件实用程序的这个 deleteDir 函数的方法
@Override
public void zipFolder(List<String> listOfFiles, File file, ZipOutputStream zos) {
try {
int index = 0;
for (File f : file.listFiles()) {
if (this.fileValidator.isHiddenFile(f))
continue;
if (f.isFile()) {
File returnedZipFile = zipFileInFolder(f);
File fileToBeRemoved = writeIntoZip(returnedZipFile, index, zos);
this.fileUtility.deleteDir(fileToBeRemoved);
index++;
} else if (f.isDirectory()) {
List<String> listOfFilesInDirectory = this.directoryProcessor.getAllFilesInDirectory(f);
String fullZipFullName = this.pathNameUtility.getFullFileName(f.getName(), FileConstants.ZIP);
FileOutputStream fos = new FileOutputStream(fullZipFullName);
ZipOutputStream zosInner = new ZipOutputStream(fos);
zipFolder(listOfFilesInDirectory, f, zosInner);
}
}
zos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
我读过我们不应该模拟文件。我想对这两种方法进行单元测试。我该怎么做?谢谢
解决方案
您的两个功能都由交互主导:与其他组件的交互,与文件系统的交互。交互主导的代码应该通过集成测试来测试。
例如,在您的deleteDir
函数中,您当然可以尝试模拟所有调用,然后测试代码。但是,你将如何模拟file.delete()
函数末尾的调用?可能您会编写模拟以简单地只返回 true 。
不幸的是,这不会帮助您找到代码中的错误之一:您没有删除符号链接。但是,这也会阻碍您的代码删除周围的目录,因为要删除的目录必须是空的。
单元测试和模拟不会帮助您找到这个问题,但是集成测试(即,将代码与文件系统和具有不同内容的目录(包括符号链接)一起运行)会告诉您它不起作用。
推荐阅读
- c# - FluentValidation 如何验证孙子
- python-3.x - ValueError:无法将字符串转换为浮点数:'21,7'
- python - 如何根据另一个文件名文件夹重命名文件夹中的所有文件名?
- .net - 无法使用 Visual Studio 2019 构建 F# 项目
- google-cloud-platform - 使用 Spark Big Query 连接器的自定义 SQL
- python - 如何将字典附加到字典字典
- firebase - 如何根据用户注册的位置设置不同的自定义声明?
- c++ - C++ 可变参数模板推导失败
- mongodb - 存储在地图中的数据,需要数组中所有对象的所有值
- javascript - 故事书 6 - 错误:您同时拥有“主”和“配置”。请从您的 configDir 中删除“config”文件