5.1 Adnotare @ParameterizedTest

Uneori doriți doar să apelați testul de mai multe ori cu parametri diferiți: valori diferite, parametri de intrare diferiți, nume de utilizator diferite. JUnit își propune să îți facă viața mai ușoară, așa că pentru acest caz are așa ceva ca testele parametrizate.

Pentru a utiliza teste parametrizate, trebuie să adăugați încă o dependență la dvs pom.xml.:

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

Apoi putem lua în considerare un exemplu:

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

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

Fiecare metodă de testare va fi apelată de 3 ori și de fiecare dată când este apelată, i se va trece un alt parametru. Valorile sunt setate folosind o altă adnotare - @ValueSource . Dar trebuie spus mai multe despre asta.

5.2 Adnotare @ValueSource

Adnotarea @ValueSource este excelentă pentru lucrul cu primitive și literale. Doar enumerați valorile parametrilor separate prin virgule și testul va fi apelat o dată pentru fiecare valoare.

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

Dar există și un minus - această adnotare nu acceptă null, așa că va trebui să utilizați o cârjă specială pentru ea - @NullSource . Arata cam asa:

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

5.3 Adnotare @EnumSource

Există, de asemenea, o adnotare specială @EnumSource , care trece toate valorile unei anumite Enum metodei. Aplicația sa arată astfel:

enum Direction {
    EAST, WEST, NORTH, SOUTH
}

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

5.4 Adnotare @MethodSource

Dar cum să treci obiectele ca parametri? Mai ales dacă au un algoritm de construcție complex. Pentru a face acest lucru, puteți specifica pur și simplu o metodă specială de ajutor care va returna o listă (Stream) cu astfel de valori.

Exemplu:

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

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

Teste parametrizate cu argumente multiple

Desigur, te-ai întrebat deja ce să faci dacă vrei să treci mai mulți parametri metodei. Există o adnotare @CSVSource foarte grozavă pentru aceasta . Vă permite să enumerați valorile parametrilor metodei, pur și simplu separate prin virgule.

Exemplu:

@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
}