5.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 . Но трябва да се каже повече за това.

5.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);
}

5.3 @EnumSource анотация

Има и специална анотация @EnumSource , която предава всички стойности на конкретен Enum към метода. Приложението му изглежда така:

enum Direction {
    EAST, WEST, NORTH, SOUTH
}

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

5.4 @MethodSource анотация

Но How да предаваме обекти като параметри? Особено ако имат сложен алгоритъм за изграждане. За да направите това, можете просто да посочите специален помощен метод, който ще върне списък (Поток) с такива стойности.

Пример:

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

static Stream<String> argsProviderFactory() {
    return Stream.of("one", "two",  "three");
}

Параметризирани тестове с множество аргументи

Разбира се, вече сте се чудor Howво да направите, ако искате да предадете няколко параметъра на метода. Има много страхотна анотация @CSVSource за това . Тя ви позволява да изброявате стойностите на параметрите на метода, просто разделени със запетаи.

Пример:

@ParameterizedTest
@CsvSource({
    "alex, 30, Programmer, Working",
    "brian, 35, Tester, Working",
	"charles, 40, manager, kicks"
})
void testWithCsvSource(String name, int age, String occupation, String status) {
	//method code
}