首页 > 解决方案 > 具有删除目录方法的单元测试文件实用程序类

问题描述

我有一个带有 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();
        }
    }

我读过我们不应该模拟文件。我想对这两种方法进行单元测试。我该怎么做?谢谢

标签: javafileunit-testing

解决方案


您的两个功能都由交互主导:与其他组件的交互,与文件系统的交互。交互主导的代码应该通过集成测试来测试。

例如,在您的deleteDir函数中,您当然可以尝试模拟所有调用,然后测试代码。但是,你将如何模拟file.delete()函数末尾的调用?可能您会编写模拟以简单地只返回 true 。

不幸的是,这不会帮助您找到代码中的错误之一:您没有删除符号链接。但是,这也会阻碍您的代码删除周围的目录,因为要删除的目录必须是空的。

单元测试和模拟不会帮助您找到这个问题,但是集成测试(即,将代码与文件系统和具有不同内容的目录(包括符号链接)一起运行)会告诉您它不起作用。


推荐阅读