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.