1. Анотація @ParameterizedTest

Іноді просто хочеться викликати тест кілька разів із різними параметрами: різні значення, різні вхідні параметри, різні імена користувачів. JUnit прагне спростити тобі життя, тому на цей випадок у нього є така річ як параметризовані тести.

Для використання параметризованих тестів треба додати ще одну залежність до твого pom.xml:

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-params</artifactId>
    <version>5.8.2</version>
    <scope>test</scope>
</dependency>

Після цього можемо розглянути приклад:


@ParameterizedTest
@ValueSource(ints = { 1, 2, 3 })
void testMethod(int argument) {
    //test code
}

@ParameterizedTest
@ValueSource(ints = { 1, 2, 3 })
void testMethodWithAutoboxing(Integer argument) {
    //test code
}

Кожен тестовий метод викликається по 3 рази і при кожному виклику до нього передається черговий параметр. Значення встановлюються за допомогою іншої анотації – @ ValueSource. Але про неї треба розповісти докладніше.

2. Анотація @ValueSource

Анотація @ValueSource чудово підходить для роботи з примітивами та літералами. Просто перерахуй значення параметра через кому, і тест викличеться по одному разу для кожного значення.


@ParameterizedTest
@ValueSource(ints = { 1, 2, 3 })
void testMethodWithAutoboxing(Integer argument) {
    //test code
}

Але є і мінус – ця анотація не підтримує null, отже потрібно буде використовувати спеціальний костиль – @ NullSource. Виглядає це так:


@ParameterizedTest
@NullSource
void testMethodNullSource(Integer argument) {
    assertTrue(argument == null);
}

3. Анотація @EnumSource

Також є спеціальна анотація @EnumSource, яка передає до методу всі значення певного Enum. Її застосування виглядає так:


enum Direction {
    EAST, WEST, NORTH, SOUTH
}

@ParameterizedTest
@EnumSource(Direction.class)
void testWithEnumSource(Direction d) {
    assertNotNull(d);
}

4. Анотація @MethodSource

А яким чином передавати об'єкти як параметри? Особливо якщо вони мають складний алгоритм побудови. Для цього можна просто вказати спеціальний допоміжний метод, який повертатиме список (Stream) з таких значень.

Приклад:


@ParameterizedTest
@MethodSource("argsProviderFactory")
void testWithMethodSource(String argument) {
    assertNotNull(argument);
}

static Stream<String> argsProviderFactory() {
    return Stream.of("один", "два",  "три");
}

5. Параметризовані тести з кількома аргументами

А якщо в метод хочеться передати кілька параметрів? Для цього є дуже класна анотація @CSVSource. Вона дозволяє перерахувати значення параметрів методу просто через кому.

Приклад:


@ParameterizedTest
@CsvSource({
    "alex, 30, Програміст, Працює",
    "brian, 35, Тестувальник, Працює",
	"charles, 40, Менеджер, Перевіряє"
})
void testWithCsvSource(String name, int age, String occupation, String status) {
	//код методу
}