Пустой 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);