Parametrisierte Tests mit @CsvSource und @MethodSource
Führen Sie denselben Test mit mehreren Eingabemengen aus, indem Sie @ParameterizedTest, @CsvSource und @MethodSource verwenden.
Parametrisierte Tests mit @CsvSource und @MethodSource ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.
Warum parametrisierte Tests?
Wenn Sie dieselbe Testlogik mit mehreren Eingabemengen ausführen, werden Grenzfälle sichtbar, ohne Testmethoden zu kopieren. JUnit 5 unterstützt parametrisierte Tests nativ mit @ParameterizedTest.
@ValueSource: Einfache Tests mit einem Wert
@ValueSource stellt einen einzelnen Parameter eines bestimmten Typs bereit. Der Test wird einmal pro Wert ausgeführt.
@ParameterizedTest
@ValueSource(strings = {"", " ", "\t"})
void blank_strings_are_rejected(String input) {
assertThrows(IllegalArgumentException.class, () -> validator.validate(input));
}@CsvSource: Mehrere Parameter inline
@CsvSource stellt Zeilen mit kommagetrennten Werten bereit. Jede Zeile entspricht einer Testausführung. Verwenden Sie einfache Anführungszeichen, um Kommas in String-Werten zu maskieren.
@ParameterizedTest
@CsvSource({
"Alice, 30, true",
"Bob, 17, false",
"Carol, 0, false"
})
void test_adult_check(String name, int age, boolean expectedAdult) {
User user = new User(name, age);
assertEquals(expectedAdult, user.isAdult());
}@CsvSource mit delimiterString
Verwenden Sie delimiterString für Trennzeichen aus mehreren Zeichen oder wenn Ihre Daten Kommas enthalten. Mit nullValues können Sie eine spezielle Zeichenkette auf null abbilden.
@ParameterizedTest
@CsvSource(value = {
"Alice | 30 | ADMIN",
"Bob | 25 | USER"
}, delimiterString = "|")
void test_roles(String name, int age, String role) { ... }@CsvFileSource: Externe Datendateien
Laden Sie Testdaten aus einer CSV-Datei im Klassenpfad. Das ist nützlich für große Datenmengen, die den Testcode unübersichtlich machen würden.
@ParameterizedTest
@CsvFileSource(resources = "/test-data/users.csv", numLinesToSkip = 1)
void test_from_file(String name, int age, boolean expected) {
assertEquals(expected, service.isEligible(name, age));
}@MethodSource: Komplexe Parameter
@MethodSource ruft eine statische Factory-Methode auf, die einen Stream<Arguments> zurückgibt. Jedes Arguments.of() entspricht einer Testausführung. Verwenden Sie diese Variante für komplexe Objekte.
@ParameterizedTest
@MethodSource("provideOrders")
void test_total_calculation(Order order, BigDecimal expected) {
assertEquals(expected, orderService.calculateTotal(order));
}
static Stream<Arguments> provideOrders() {
return Stream.of(
Arguments.of(new Order(List.of(item(10), item(20))), BigDecimal.valueOf(30)),
Arguments.of(new Order(List.of()), BigDecimal.ZERO)
);
}@EnumSource: Alle Enum-Werte testen
@EnumSource führt den Test einmal für jede Enum-Konstante aus. Mit mode und names können Sie bestimmte Werte einschließen oder ausschließen.
@ParameterizedTest
@EnumSource(value = UserStatus.class, mode = EnumSource.Mode.EXCLUDE, names = "DELETED")
void test_active_statuses(UserStatus status) {
assertTrue(notificationService.shouldNotify(status));
}@NullAndEmptySource
Kurzform zum Testen von null- und leeren String-Eingaben. Kombinieren Sie @ValueSource mithilfe von @NullSource und @EmptySource oder verwenden Sie die kombinierte Annotation @NullAndEmptySource.
@ParameterizedTest
@NullAndEmptySource
void null_and_empty_are_invalid(String input) {
assertFalse(validator.isValid(input));
}Benutzerdefinierte Anzeigenamen
Verwenden Sie name in @ParameterizedTest, um den Anzeigenamen des Tests zu formatieren. Platzhalter: {index}, {0}, {1}, {arguments}.
@ParameterizedTest(name = "age={1} should be adult={2}")
@CsvSource({"Alice, 30, true", "Bob, 17, false"})
void test_adult(String name, int age, boolean expected) { ... }Quellen mit @ArgumentsSource kombinieren
Implementieren Sie ArgumentsProvider für eine vollständig benutzerdefinierte Argumentgenerierung – etwa für dynamische Daten aus Datenbanken, Dateien oder APIs.
public class UserArgumentsProvider implements ArgumentsProvider {
public Stream<? extends Arguments> provideArguments(ExtensionContext ctx) {
return Stream.of(
Arguments.of(new User("Alice", 30)),
Arguments.of(new User("Bob", 17))
);
}
}
@ParameterizedTest
@ArgumentsSource(UserArgumentsProvider.class)
void test_user(User user) { ... }Parametrisierte Tests für Grenzwerte
Testen Sie Grenzbedingungen systematisch: min-1, min, max, max+1. Parametrisierte Tests machen die Abdeckung von Grenzwerten übersichtlich und wartbar.
@ParameterizedTest
@CsvSource({"0, false", "1, true", "100, true", "101, false"})
void test_range_boundaries(int value, boolean expected) {
assertEquals(expected, validator.isInRange(value, 1, 100));
}Kurzer Test
Welcher von @MethodSource zurückgegebene Typ stellt die Argumente für jede Testausführung bereit?
Zusammenfassung
Verwenden Sie @CsvSource für tabellarische Daten inline, @MethodSource für komplexe Objekte, @EnumSource für alle Enum-Werte und @NullAndEmptySource für Null- und Leerwert-Grenzfälle. Benutzerdefinierte Namen mit name= verbessern die Lesbarkeit von Tests.
Häufig gestellte Fragen
Ist die Lektion „Parametrisierte Tests mit @CsvSource und @MethodSource“ kostenlos?
Ja — der vollständige Text von „Parametrisierte Tests mit @CsvSource und @MethodSource“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Parametrisierte Tests mit @CsvSource und @MethodSource“?
Führen Sie denselben Test mit mehreren Eingabemengen aus, indem Sie @ParameterizedTest, @CsvSource und @MethodSource verwenden. Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Java Academy zu starten?
Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „Parametrisierte Tests mit @CsvSource und @MethodSource“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?
Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Parametrisierte Tests mit @CsvSource und @MethodSource
- Mockito für Fortgeschrittene: Argument-Captoren und Spies
- Spring-Boot-Test-Slices: @WebMvcTest und @DataJpaTest
- Testcontainers: Integrationstests mit echter Datenbank