5.1 @ParameterizedTest-anteckning

Ibland vill du bara anropa testet flera gånger med olika parametrar: olika värden, olika ingångsparametrar, olika användarnamn. JUnit syftar till att göra ditt liv enklare, så för det här fallet har den något som parameteriserade tester.

För att använda parameteriserade tester måste du lägga till ytterligare ett beroende till din pom.xml:

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

Då kan vi ta ett exempel:

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

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

Varje testmetod kommer att anropas 3 gånger, och varje gång den anropas kommer en annan parameter att skickas till den. Värden ställs in med en annan anteckning - @ValueSource . Men mer behöver sägas om det.

5.2 @ValueSource-anteckning

@ValueSource -kommentaren är utmärkt för att arbeta med primitiva och bokstavliga. Lista bara parametervärdena separerade med kommatecken och testet kommer att anropas en gång för varje värde.

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

Men det finns också ett minus - den här kommentaren stöder inte null, så du måste använda en speciell krycka för det - @NullSource . Det ser ut så här:

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

5.3 @EnumSource-anteckning

Det finns också en speciell anteckning @EnumSource , som skickar alla värden för en specifik Enum till metoden. Dess applikation ser ut så här:

enum Direction {
    EAST, WEST, NORTH, SOUTH
}

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

5.4 @MethodSource-anteckning

Men hur skickar man objekt som parametrar? Speciellt om de har en komplex konstruktionsalgoritm. För att göra detta kan du helt enkelt ange en speciell hjälpmetod som returnerar en lista (Stream) med sådana värden.

Exempel:

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

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

Parameteriserade tester med flera argument

Naturligtvis har du redan undrat vad du ska göra om du vill skicka flera parametrar till metoden. Det finns en väldigt cool @CSVSource- anteckning för detta . Det låter dig lista värdena för metodparametrarna helt enkelt separerade med kommatecken.

Exempel:

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