[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-spring-test-chto-takoe-parameterizedtest-i-kak-on-ispolzuetsya":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":15,"progress":16,"seo":17},708,"chto-takoe-parameterizedtest-i-kak-on-ispolzuetsya",16,"spring-test","Spring Test","🧪","Что такое ParameterizedTest и как он используется?","`@ParameterizedTest` — аннотация JUnit 5, позволяющая запускать один и тот же тест с разными входными данными. Это избавляет от дублирования кода при тестировании одной и той же логики с различными параметрами.\n\n### Источники данных\n\n**ValueSource** — простые литеральные значения:\n\n```java\n@ParameterizedTest\n@ValueSource(strings = {\"ivan@example.com\", \"test@mail.ru\", \"user@domain.org\"})\nvoid shouldAcceptValidEmails(String email) {\n    assertTrue(validator.isValidEmail(email));\n}\n```\n\n**NullSource, EmptySource, NullAndEmptySource** — null и пустые значения:\n\n```java\n@ParameterizedTest\n@NullAndEmptySource\n@ValueSource(strings = {\"  \", \"\\t\", \"\\n\"})\nvoid shouldRejectBlankStrings(String input) {\n    assertThrows(IllegalArgumentException.class,\n        () -> userService.create(input));\n}\n```\n\n**EnumSource** — значения перечислений:\n\n```java\n@ParameterizedTest\n@EnumSource(value = UserRole.class, names = {\"ADMIN\", \"MODERATOR\"})\nvoid shouldHaveElevatedPermissions(UserRole role) {\n    assertTrue(role.hasElevatedPermissions());\n}\n```\n\n**CsvSource** — данные в формате CSV:\n\n```java\n@ParameterizedTest\n@CsvSource({\n    \"1, 1, 2\",\n    \"2, 3, 5\",\n    \"10, -5, 5\",\n    \"0, 0, 0\"\n})\nvoid shouldAddNumbers(int a, int b, int expectedSum) {\n    assertEquals(expectedSum, calculator.add(a, b));\n}\n```\n\n**MethodSource** — данные из метода:\n\n\u003Cdetails>\u003Csummary>Пример кода\u003C\u002Fsummary>\n\n```java\n@ParameterizedTest\n@MethodSource(\"provideUsersForValidation\")\nvoid shouldValidateUsers(String name, String email, boolean expected) {\n    assertEquals(expected, validator.isValid(name, email));\n}\n\nstatic Stream\u003CArguments> provideUsersForValidation() {\n    return Stream.of(\n        Arguments.of(\"Иван\", \"ivan@example.com\", true),\n        Arguments.of(\"\", \"ivan@example.com\", false),\n        Arguments.of(\"Иван\", \"not-an-email\", false),\n        Arguments.of(null, null, false)\n    );\n}\n```\n\n\u003C\u002Fdetails>\n\n### Кастомное имя теста\n\n```java\n@ParameterizedTest(name = \"{index}: {0} + {1} = {2}\")\n@CsvSource({\"1,1,2\", \"2,3,5\", \"10,-5,5\"})\nvoid shouldAddWithDisplayName(int a, int b, int expected) {\n    assertEquals(expected, calculator.add(a, b));\n}\n```\n\n> **На собеседовании:** перечислите 3-4 источника данных (`@ValueSource`, `@CsvSource`, `@MethodSource`, `@EnumSource`) и объясните, когда какой использовать. Частая ошибка — не знать про `@MethodSource` для сложных объектов и пытаться впихнуть всё в `@CsvSource`.","","junior",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":22,"featuredSnippetReady":23},"Что такое ParameterizedTest и как он используется? — Gymterview","`@ParameterizedTest` — аннотация JUnit 5, позволяющая запускать один и тот же тест с разными входными данными. Это избавляет от дублирования кода при тестирован","`@ParameterizedTest` — аннотация JUnit 5, позволяющая запускать один и тот же тест с разными входными данными. Это избав",[7,13],"`@ParameterizedTest` — аннотация JUnit 5, позволяющая запускать один и тот же тест с разными входными данными. Это избавляет от дублирования кода при тестировании одной и той же логики с различными параметрами.",true]