Какие виды исключений вы знаете в контексте тестирования Java-приложений?

«Какие виды исключений вы знаете в контексте тестирования Java-приложений?» — вопрос из категории Java, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При тестировании Java-приложений (например, с JUnit) важно понимать типы исключений, чтобы правильно их ожидать и обрабатывать в тестах.

1. Checked Exceptions (Проверяемые исключения)

  • Что это: Исключения, которые компилятор обязывает обработать (через try-catch) или объявить в сигнатуре метода (throws).
  • Примеры: IOException, SQLException, FileNotFoundException.
  • Как тестируем: В тестах мы можем ожидать, что метод выбросит такое исключение при определенных условиях (например, файл не найден). Используем assertThrows() из JUnit 5.
    @Test
    void readFile_fileNotFound_throwsIOException() {
    FileReaderService service = new FileReaderService();
    assertThrows(FileNotFoundException.class, () -> {
        service.readFile("non_existent.txt");
    });
    }

2. Unchecked Exceptions (Непроверяемые исключения / RuntimeException)

  • Что это: Исключения, которые не нужно объявлять. Часто указывают на ошибки программиста.
  • Примеры: NullPointerException, IllegalArgumentException, ArrayIndexOutOfBoundsException.
  • Как тестируем: Тестируем валидацию входных данных, чтобы эти исключения не возникали. Или проверяем, что код корректно их обрабатывает.
    @Test
    void calculateDiscount_negativePrice_throwsIllegalArgumentException() {
    Calculator calc = new Calculator();
    assertThrows(IllegalArgumentException.class, () -> {
        calc.calculateDiscount(-100.0);
    });
    }

3. Errors (Ошибки)

  • Что это: Критические проблемы на уровне JVM, которые обычно не перехватываются.
  • Примеры: OutOfMemoryError, StackOverflowError.
  • Как тестируем: В интеграционных или нагрузочных тестах (например, с помощью JMeter) можем проверить, как система ведет себя при нехватке памяти, и корректно ли логирует ошибки.

Для тестирования также полезны пользовательские исключения (наследники Exception или RuntimeException), которые специфичны для бизнес-логики приложения.