Пустой catch (Empty Catch)

Блок catch перехватывает исключение и ничего с ним не делает. Тест остаётся зелёным, хотя проверяемая функциональность могла не выполниться вовсе.

Симптомы

  • catch (Exception e) { } или catch (Exception e) { // TODO }
  • catch с только e.printStackTrace() — исключение не пробрасывается, тест не падает
  • Отсутствие assert после блока try-catch — тест завершается без единой проверки
  • Комментарий // ignore или // не должно упасть в catch-блоке

Причины возникновения

  • Компилятор требует обработки checked exception — проще написать пустой catch, чем разобраться
  • «Тест прошёл» воспринимается как «всё работает», без понимания, что выполнилось
  • Копипаста кода, в котором исключение действительно не важно, в контекст, где оно важно
  • Давление сроков: «потом разберёмся с этим TODO»

Почему это проблема

  • Ложноположительные результаты: тест зелёный, но функция не была выполнена — дефект скрыт
  • Потеря сигнала: система сломана, но сьют отчитывается 100% passed
  • Трудно обнаружить: на первый взгляд тест выглядит нормально, проблема видна только при внимательном чтении
  • Нет смысла в таком тесте: он не проверяет ничего и создаёт ложную уверенность в покрытии

Решение

Позволить исключению всплыть или проверить его явно:

// ❌
try {
    uploadPage.upload("contract.pdf");
} catch (Exception e) {
    // TODO
}

// ✅ JUnit 5 сам поймает и провалит тест
uploadPage.upload("contract.pdf");
assertThat(uploadPage.getSuccessMessage()).isEqualTo("Документ загружен");

// Если ожидается исключение — проверять явно
assertThatThrownBy(() -> uploadPage.upload("image.exe"))
    .isInstanceOf(InvalidFileException.class);