Как вы создаете параметризированные тесты в JUnit 5?

«Как вы создаете параметризированные тесты в JUnit 5?» — вопрос из категории Тестирование, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Параметризированные тесты в JUnit 5 создаются с помощью аннотации @ParameterizedTest и указания источника данных (@ValueSource, @CsvSource, @MethodSource и др.). Они позволяют запустить один тестовый метод многократно с разными аргументами.

1. Простые значения (@ValueSource, @NullSource, @EmptySource):

@ParameterizedTest
@ValueSource(strings = {"", "  ", "t", "n"})
@NullSource
@EmptySource
void isBlank_ShouldReturnTrueForAllBlankStrings(String input) {
    assertTrue(Strings.isBlank(input));
}

2. Парные аргументы из CSV (@CsvSource):

@ParameterizedTest
@CsvSource({
    "2, 3, 6",    // умножение 2 * 3 = 6
    "5, 0, 0",    // умножение на 0
    "-4, 7, -28" // работа с отрицательными числами
})
void multiply_ShouldReturnCorrectResult(int a, int b, int expected) {
    assertEquals(expected, Calculator.multiply(a, b));
}

3. Сложные аргументы из метода (@MethodSource):

@ParameterizedTest
@MethodSource("provideUsersForValidation") // Указывает на фабричный метод
void userValidation_ShouldFollowBusinessRules(User user, boolean expectedIsValid) {
    assertEquals(expectedIsValid, Validator.isUserValid(user));
}

private static Stream<Arguments> provideUsersForValidation() {
    return Stream.of(
        Arguments.of(new User("ValidName", 25), true),
        Arguments.of(new User("", 25), false),      // Пустое имя
        Arguments.of(new User("ValidName", 12), false) // Возраст < 18
    );
}

4. Аргументы из внешнего файла (@CsvFileSource):

@ParameterizedTest
@CsvFileSource(resources = "/test-data.csv", numLinesToSkip = 1)
void testWithDataFromCsvFile(String input, int expected) {
    // ... тест использует данные из файла src/test/resources/test-data.csv
}

Преимущества:

  • Уменьшение дублирования кода: Один метод вместо множества почти идентичных @Test.
  • Явность тестовых данных: Все сценарии видны непосредственно в коде теста или в отдельном файле.
  • Улучшенные отчеты: JUnit отчетит о каждом запуске параметра отдельно, упрощая отладку падающих сценариев.