Как протестировать данный метод?

265
06 августа 2021, 21:00

Есть класс, методы которого необходимо протестировать. Собственно проблема: не могу правильно mock'нуть объекты тестируемого класса для покрытия метода тестом.

Метод класса, который необходимо протестировать.

public List<FileInfo> getAllFileInfos(Path dirPath) {
if (!Files.exists(dirPath)) {
  throw new IllegalArgumentException(
      getLocalizedMessage("dir_not_exists", dirPath));
}
Stream<Path> pathStream = Arrays.stream(getArrayOfPaths(dirPath))
    .map(fileName -> dirPath + fileName)
    .map(Paths::get);
  return pathStream
      .filter(path -> path.getFileName().toString().equals(metaInfoFileName))
      .map(this::getFileInfosFromMetaInfo)
      .flatMap(List::stream)
      .collect(Collectors.toList()); } 
public String[] getArrayOfPaths(Path dirPath) {
File directory = new File(dirPath.toString());
return directory.list(); }

Подскажите, что мне следует сделать дальше? Как mock'нуть Stream и его методы?

Answer 1

Если метод занимается чисто вызовом системных функций типа получения списка файлов или получения атрибутов файла, то вы в своем тесте будете тестировать системные функции, что само по себе смысла не имеет как минимум по нескольким причинам:

  1. Внешние библиотеки уже должны быть протестированы производителем, то есть писать на них тесты - это двойная работа
  2. Внешние библиотеки не относятся к коду проекта, потому тесты внешних библиотек не проверяют качество кода в вашем проекте
  3. Падение тестов внешних библиотек вы не решите изменением своего кода, если вы по прежнему будете пользоваться тем же функционалом библиотеки
  4. Для проверки работоспособности всей системы в целом (в том числе интеграции вашего кода между собой и внешними системами), существуют интеграционные тесты
Answer 2

Не нужно мокать Arrays.stream. Можно в unit-тестах воспользоваться правилом TemporaryFolder

@Rule
public TemporaryFolder tmpFolder = new TemporaryFolder();
@Test
public void yourTestWithoutMocks() {
    <prepare tmpFolder, add files, add folder into it>
    List<FileInfo> infos = getAllFileInfos(tmpFolder.getRoot().toPath())
    <assert your infos>
}
READ ALSO
Broadcast receiver SMS/CALL не работают вне приложения

Broadcast receiver SMS/CALL не работают вне приложения

На андройд 90 мои броадкасты на прослушку смс и входящих звонков не работают если активити останавливается

201
Объединить два куска кода в один

Объединить два куска кода в один

Всем привет, мучаю калькулятор, есть два куска кода, один предназначен для того чтобы суммировать значения в select, другой суммировать значения...

438
Преобразование строки в JSON через JSON.parse

Преобразование строки в JSON через JSON.parse

Я получаю с сервера экранированную строку в виде:

221