[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-testirovanie-kak-testirovat-isklyucheniya-v-junit-5":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":16,"progress":17,"seo":18},1294,"kak-testirovat-isklyucheniya-v-junit-5",42,"testirovanie","Тестирование","✅","Как тестировать исключения в JUnit 5?","В JUnit 5 исключения тестируются через `assertThrows()`, который возвращает пойманное исключение для дополнительных проверок. В AssertJ используется `assertThatThrownBy()` с fluent API.\n\n### assertThrows (JUnit 5)\n\n```java\n@Test\nvoid shouldThrowWhenUserNotFound() {\n    Exception ex = assertThrows(NotFoundException.class,\n        () -> userService.findById(-1L));\n\n    assertThat(ex.getMessage()).contains(\"not found\");\n}\n\n@Test\nvoid shouldNotThrowForValidInput() {\n    assertDoesNotThrow(() -> userService.findById(1L));\n}\n```\n\n### assertThatThrownBy (AssertJ)\n\n```java\n@Test\nvoid shouldThrowWithDetails() {\n    assertThatThrownBy(() -> userService.findById(-1L))\n        .isInstanceOf(NotFoundException.class)\n        .hasMessage(\"User not found: -1\")\n        .hasNoCause();\n}\n\n\u002F\u002F Проверка вложенного исключения (cause)\n@Test\nvoid shouldWrapDatabaseException() {\n    assertThatThrownBy(() -> userService.findById(999L))\n        .isInstanceOf(ServiceException.class)\n        .hasCauseInstanceOf(DataAccessException.class);\n}\n```\n\n### Сравнение подходов\n\n| Подход | Библиотека | Стиль | Цепочки проверок |\n|--------|-----------|-------|-----------------|\n| `assertThrows()` | JUnit 5 | Императивный | Нет (отдельные assert) |\n| `assertThatThrownBy()` | AssertJ | Fluent | Да |\n| `@Test(expected=...)` | JUnit 4 | Аннотация | Нет (устарело) |\n\n### Ключевые принципы\n\n- `assertThrows` возвращает исключение -- можно проверить message, cause, поля\n- `assertThatThrownBy` (AssertJ) -- fluent API с цепочкой проверок\n- В JUnit 4 использовались `@Test(expected=...)` и `ExpectedException` rule -- устарело\n\n### Частые ошибки\n\n- `@Test(expected = Exception.class)` -- это JUnit 4; в JUnit 5 используйте `assertThrows`\n- Слишком широкий тип -- `assertThrows(Exception.class, ...)` поймает любое исключение; используйте конкретный тип\n- Не проверять message -- два разных `IllegalArgumentException` могут означать разные ошибки\n\n### Как используется в 2026\n\n- `assertThrows` (JUnit 5) + `assertThatThrownBy` (AssertJ) -- два стандартных подхода\n\n> **На собеседовании:** интервьюер может попросить написать тест на исключение. Важно показать, что вы проверяете не только тип, но и сообщение, и cause. Частая ошибка -- использовать `@Test(expected=...)` из JUnit 4 или ловить слишком широкий тип исключения.","","junior",[15],"testing",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":23,"featuredSnippetReady":24},"Как тестировать исключения в JUnit 5? — Gymterview","В JUnit 5 исключения тестируются через `assertThrows()`, который возвращает пойманное исключение для дополнительных проверок. В AssertJ используется `assertThat","В JUnit 5 исключения тестируются через `assertThrows()`, который возвращает пойманное исключение для дополнительных пров",[15,13],"В JUnit 5 исключения тестируются через `assertThrows()`, который возвращает пойманное исключение для дополнительных проверок. В AssertJ используется `assertThatThrownBy()` с fluent API.",true]