5.1 @ParameterizedTest-kommentar

Noen ganger vil du bare ringe testen flere ganger med forskjellige parametere: forskjellige verdier, forskjellige inngangsparametere, forskjellige brukernavn. JUnit har som mål å gjøre livet ditt enklere, så for dette tilfellet har den noe som parameteriserte tester.

For å bruke parameteriserte tester, må du legge til enda en avhengighet til pom.xml:

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

Så kan vi vurdere et eksempel:

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

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

Hver testmetode vil bli kalt 3 ganger, og hver gang den kalles, vil en annen parameter bli sendt til den. Verdier settes ved hjelp av en annen merknad - @ValueSource . Men mer må sies om det.

5.2 @ValueSource-kommentar

@ValueSource- kommentaren er flott for å jobbe med primitiver og bokstaver. Bare oppgi parameterverdiene atskilt med komma, og testen vil bli kalt én gang for hver verdi.

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

Men det er også et minus - denne merknaden støtter ikke null, så du må bruke en spesiell krykke for det - @NullSource . Det ser slik ut:

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

5.3 @EnumSource-kommentar

Det er også en spesiell merknad @EnumSource , som overfører alle verdiene til en spesifikk Enum til metoden. Applikasjonen ser slik ut:

enum Direction {
    EAST, WEST, NORTH, SOUTH
}

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

5.4 @MethodSource-kommentar

Men hvordan sende objekter som parametere? Spesielt hvis de har en kompleks konstruksjonsalgoritme. For å gjøre dette kan du ganske enkelt spesifisere en spesiell hjelpemetode som vil returnere en liste (Strøm) med slike verdier.

Eksempel:

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

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

Parameteriserte tester med flere argumenter

Selvfølgelig har du allerede lurt på hva du skal gjøre hvis du vil overføre flere parametere til metoden. Det er en veldig kul @CSVSource- kommentar for dette . Den lar deg liste opp verdiene til metodeparameterne ganske enkelt atskilt med komma.

Eksempel:

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