Test parametrizzati con @CsvSource e @MethodSource
Esegua lo stesso test con diversi insiemi di input usando @ParameterizedTest, @CsvSource e @MethodSource.
Test parametrizzati con @CsvSource e @MethodSource è una lezione Java Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Java Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Java Academy include 4 lezioni in totale.
Perché utilizzare i test parametrizzati?
Eseguire la stessa logica di test con più insiemi di dati in ingresso permette di individuare i casi limite senza duplicare i metodi di test. JUnit 5 supporta nativamente i test parametrizzati con @ParameterizedTest.
@ValueSource: test semplici con un solo valore
@ValueSource fornisce un singolo parametro di un determinato tipo. Il test viene eseguito una volta per ogni valore.
@ParameterizedTest
@ValueSource(strings = {"", " ", "\t"})
void blank_strings_are_rejected(String input) {
assertThrows(IllegalArgumentException.class, () -> validator.validate(input));
}@CsvSource: più parametri inline
@CsvSource fornisce righe di valori separati da virgole. Ogni riga corrisponde a un'esecuzione del test. Utilizzi gli apici singoli per gestire le virgole nei valori stringa.
@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 con delimiterString
Utilizzi delimiterString per delimitatori composti da più caratteri o quando i dati contengono virgole. Utilizzi nullValues per mappare una stringa sentinella a null.
@ParameterizedTest
@CsvSource(value = {
"Alice | 30 | ADMIN",
"Bob | 25 | USER"
}, delimiterString = "|")
void test_roles(String name, int age, String role) { ... }@CsvFileSource: file di dati esterni
Carichi i dati di test da un file CSV nel classpath. È utile per grandi quantità di dati che renderebbero il codice dei test difficile da leggere.
@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: parametri complessi
@MethodSource chiama un metodo factory statico che restituisce uno Stream<Arguments>. Ogni Arguments.of() corrisponde a un'esecuzione del test. Lo utilizzi per oggetti complessi.
@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: test di tutti i valori di un enum
@EnumSource esegue il test una volta per ogni costante dell'enum. Utilizzi mode e names per includere o escludere valori specifici.
@ParameterizedTest
@EnumSource(value = UserStatus.class, mode = EnumSource.Mode.EXCLUDE, names = "DELETED")
void test_active_statuses(UserStatus status) {
assertTrue(notificationService.shouldNotify(status));
}@NullAndEmptySource
È una forma abbreviata per testare input null e stringhe vuote. La combini con @ValueSource usando @NullSource + @EmptySource, oppure utilizzi l'annotazione combinata @NullAndEmptySource.
@ParameterizedTest
@NullAndEmptySource
void null_and_empty_are_invalid(String input) {
assertFalse(validator.isValid(input));
}Nomi visualizzati personalizzati
Utilizzi name in @ParameterizedTest per formattare il nome visualizzato del test. Segnaposto disponibili: {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) { ... }Combinazione delle sorgenti con @ArgumentsSource
Implementi ArgumentsProvider per una generazione completamente personalizzata degli argomenti, con dati dinamici provenienti da database, file o API.
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) { ... }Test parametrizzati per i valori limite
Testi sistematicamente le condizioni limite: min-1, min, max, max+1. I test parametrizzati rendono la copertura dei limiti leggibile e facile da mantenere.
@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));
}Verifica rapida
Quale tipo restituito da @MethodSource fornisce gli argomenti per ogni esecuzione del test?
Riepilogo
Utilizzi @CsvSource per dati tabellari inline, @MethodSource per oggetti complessi, @EnumSource per tutti i valori di un enum e @NullAndEmptySource per i casi limite null/vuoti. I nomi personalizzati con name= migliorano la leggibilità dei test.
Domande Frequenti
La lezione «Test parametrizzati con @CsvSource e @MethodSource» è gratuita?
Sì — il testo completo di «Test parametrizzati con @CsvSource e @MethodSource» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Java Academy, passa a CoddyKit PRO. Il corso Java Academy include 4 lezioni in totale.
Cosa imparerò in «Test parametrizzati con @CsvSource e @MethodSource»?
Esegua lo stesso test con diversi insiemi di input usando @ParameterizedTest, @CsvSource e @MethodSource. Eserciti Java Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Java Academy?
Non è richiesta alcuna esperienza precedente. Java Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «Test parametrizzati con @CsvSource e @MethodSource»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Java Academy?
Sì. Ogni lezione Java Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Test parametrizzati con @CsvSource e @MethodSource
- Mockito avanzato: ArgumentCaptor e spy
- Slice di test Spring Boot: @WebMvcTest e @DataJpaTest
- Testcontainers: test di integrazione con database reali