Parameteriserte tester med @CsvSource og @MethodSource
Kjør den samme testen med flere inputsett ved hjelp av @ParameterizedTest, @CsvSource og @MethodSource.
Parameteriserte tester med @CsvSource og @MethodSource er en gratis leksjon i Java Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Java Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Java Academy inneholder totalt 4 leksjoner.
Hvorfor parametriserte tester?
Ved å kjøre den samme testlogikken med flere inndata avsløres kanttilfeller uten at testmetoder må kopieres. JUnit 5 støtter parametriserte tester innebygd med @ParameterizedTest.
@ValueSource: Enkle tester med én verdi
@ValueSource gir én parameter av en bestemt type. Testen kjøres én gang per verdi.
@ParameterizedTest
@ValueSource(strings = {"", " ", "\t"})
void blank_strings_are_rejected(String input) {
assertThrows(IllegalArgumentException.class, () -> validator.validate(input));
}@CsvSource: Flere parametere direkte i koden
@CsvSource gir rader med kommaseparerte verdier. Hver rad er én testkjøring. Bruk enkle anførselstegn for å håndtere kommaer i strengverdier.
@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 med delimiterString
Bruk delimiterString for skilletegn med flere tegn, eller når dataene inneholder kommaer. Bruk nullValues for å mappe en plassholderstreng til null.
@ParameterizedTest
@CsvSource(value = {
"Alice | 30 | ADMIN",
"Bob | 25 | USER"
}, delimiterString = "|")
void test_roles(String name, int age, String role) { ... }@CsvFileSource: Eksterne datafiler
Last inn testdata fra en CSV-fil på klassestien. Dette er nyttig for store datasett som ellers ville gjort testkoden uoversiktlig.
@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: Komplekse parametere
@MethodSource kaller en statisk fabrikkmetode som returnerer en Stream<Arguments>. Hvert Arguments.of() er én testkjøring. Bruk dette for komplekse objekter.
@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: Teste alle enum-verdier
@EnumSource kjører testen én gang for hver enum-konstant. Bruk mode og names for å inkludere eller utelate bestemte verdier.
@ParameterizedTest
@EnumSource(value = UserStatus.class, mode = EnumSource.Mode.EXCLUDE, names = "DELETED")
void test_active_statuses(UserStatus status) {
assertTrue(notificationService.shouldNotify(status));
}@NullAndEmptySource
En kortform for å teste inndata med null og tom streng. Kombiner med @ValueSource ved å bruke @NullSource + @EmptySource, eller bruk den kombinerte @NullAndEmptySource.
@ParameterizedTest
@NullAndEmptySource
void null_and_empty_are_invalid(String input) {
assertFalse(validator.isValid(input));
}Egendefinerte visningsnavn
Bruk name i @ParameterizedTest for å formatere testens visningsnavn. Plassholdere: {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) { ... }Kombinere kilder med @ArgumentsSource
Implementer ArgumentsProvider for fullstendig egendefinert generering av argumenter — dynamiske data fra databaser, filer eller API-er.
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) { ... }Parametriserte tester for grenseverdier
Test systematisk grensebetingelser: min-1, min, maks, maks+1. Parametriserte tester gjør grensedekningen lesbar og enkel å vedlikeholde.
@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));
}Hurtigsjekk
Hvilken returtype fra @MethodSource gir argumentene for hver testkjøring?
Oppsummering
Bruk @CsvSource for tabellformede data direkte i koden, @MethodSource for komplekse objekter, @EnumSource for alle enum-verdier og @NullAndEmptySource for kanttilfeller med null eller tomme verdier. Egendefinerte navn med name= gjør testene enklere å lese.
Lær deg Java med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 104
- Leksjoner
- 374
Ofte stilte spørsmål
Er leksjonen «Parameteriserte tester med @CsvSource og @MethodSource» gratis?
Ja – hele teksten i «Parameteriserte tester med @CsvSource og @MethodSource» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Java Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Java Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Parameteriserte tester med @CsvSource og @MethodSource»?
Kjør den samme testen med flere inputsett ved hjelp av @ParameterizedTest, @CsvSource og @MethodSource. Du øver på Java Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Java Academy?
Ingen tidligere erfaring er nødvendig. Java Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.
Hvor lang tid tar leksjonen «Parameteriserte tester med @CsvSource og @MethodSource»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Java Academy-leksjonen?
Ja. Alle Java Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Parameteriserte tester med @CsvSource og @MethodSource
- Avansert Mockito: argumentfangere og spioner
- Spring Boot-testskiver: @WebMvcTest og @DataJpaTest
- Testcontainers: integrasjonstester mot en ekte database