Ответ
При тестировании 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), которые специфичны для бизнес-логики приложения.