Gymterview
junior

Что такое ParameterizedTest и как он используется?

@ParameterizedTest — аннотация JUnit 5, позволяющая запускать один и тот же тест с разными входными данными. Это избавляет от дублирования кода при тестировании одной и той же логики с различными параметрами.

Источники данных

ValueSource — простые литеральные значения:

Пример
@ParameterizedTest
@ValueSource(strings = {"ivan@example.com", "test@mail.ru", "user@domain.org"})
void shouldAcceptValidEmails(String email) {
    assertTrue(validator.isValidEmail(email));
}

NullSource, EmptySource, NullAndEmptySource — null и пустые значения:

Пример
@ParameterizedTest
@NullAndEmptySource
@ValueSource(strings = {"  ", "\t", "\n"})
void shouldRejectBlankStrings(String input) {
    assertThrows(IllegalArgumentException.class,
        () -> userService.create(input));
}

EnumSource — значения перечислений:

Пример
@ParameterizedTest
@EnumSource(value = UserRole.class, names = {"ADMIN", "MODERATOR"})
void shouldHaveElevatedPermissions(UserRole role) {
    assertTrue(role.hasElevatedPermissions());
}

CsvSource — данные в формате CSV:

Пример
@ParameterizedTest
@CsvSource({
    "1, 1, 2",
    "2, 3, 5",
    "10, -5, 5",
    "0, 0, 0"
})
void shouldAddNumbers(int a, int b, int expectedSum) {
    assertEquals(expectedSum, calculator.add(a, b));
}

MethodSource — данные из метода:

Пример кода
@ParameterizedTest
@MethodSource("provideUsersForValidation")
void shouldValidateUsers(String name, String email, boolean expected) {
    assertEquals(expected, validator.isValid(name, email));
}

static Stream<Arguments> provideUsersForValidation() {
    return Stream.of(
        Arguments.of("Иван", "ivan@example.com", true),
        Arguments.of("", "ivan@example.com", false),
        Arguments.of("Иван", "not-an-email", false),
        Arguments.of(null, null, false)
    );
}

Кастомное имя теста

Пример
@ParameterizedTest(name = "{index}: {0} + {1} = {2}")
@CsvSource({"1,1,2", "2,3,5", "10,-5,5"})
void shouldAddWithDisplayName(int a, int b, int expected) {
    assertEquals(expected, calculator.add(a, b));
}

На собеседовании: перечислите 3-4 источника данных (@ValueSource, @CsvSource, @MethodSource, @EnumSource) и объясните, когда какой использовать. Частая ошибка — не знать про @MethodSource для сложных объектов и пытаться впихнуть всё в @CsvSource.