Утилита для проверки класса файла с методом удаления каталога - PullRequest
0 голосов
/ 23 января 2020

У меня есть класс файловой утилиты с функцией 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();
        }
    }

Я прочитал что мы не должны издеваться над файлом. Я хочу провести модульное тестирование 2-х методов. Как я могу это сделать? Спасибо

Ответы [ 2 ]

0 голосов
/ 28 марта 2020

В обеих ваших функциях преобладают взаимодействия: взаимодействия с другими компонентами, взаимодействия с файловой системой. Код с преобладанием взаимодействия следует скорее тестировать с помощью интеграционного тестирования.

Например, в вашей функции deleteDir вы, безусловно, можете попытаться смоделировать все вызовы, а затем протестировать код. Но как бы вы посмеялись над вызовом file.delete() в конце функции? Возможно, вы бы написали макет, чтобы просто ничего не делать, но вернуть true.

К сожалению, это не поможет вам найти одну из ошибок в вашем коде: вы не удаляете символьные ссылки c. Но это также помешает вашему коду удалить окружающий каталог, потому что для удаления каталог должен быть пустым.

Юнит-тестирование и макеты не помогут вам найти эту проблему, но интеграционное тестирование (которое то есть запуск кода вместе с файловой системой и каталогами с различным содержимым, включая символьные c ссылки) покажет вам, что он не работает.

0 голосов
/ 23 января 2020

Решение не Mock, а Spy, шпион похоже на выборочный макет, когда вы можете иметь некоторые методы, которые вызывают реальные операции, а другие могут быть имитировать. Таким образом, при тестировании zipFolder вы можете высмеять ваш deleteDir звонок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...