Testes parametrizados com @CsvSource e @MethodSource
Execute o mesmo teste com vários conjuntos de entrada usando @ParameterizedTest, @CsvSource e @MethodSource.
Testes parametrizados com @CsvSource e @MethodSource é uma aula grátis de Java Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Java Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Java Academy inclui 4 aulas no total.
Por que usar testes parametrizados?
Executar a mesma lógica de teste com vários conjuntos de entrada revela casos-limite sem copiar e colar métodos de teste. O JUnit 5 oferece suporte nativo a testes parametrizados com @ParameterizedTest.
@ValueSource: testes simples com um único valor
@ValueSource fornece um único parâmetro de um determinado tipo. O teste é executado uma vez para cada valor.
@ParameterizedTest
@ValueSource(strings = {"", " ", "\t"})
void blank_strings_are_rejected(String input) {
assertThrows(IllegalArgumentException.class, () -> validator.validate(input));
}@CsvSource: vários parâmetros em linha
@CsvSource fornece linhas de valores separados por vírgulas. Cada linha corresponde a uma invocação do teste. Use aspas simples para escapar vírgulas em valores de texto.
@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 com delimiterString
Use delimiterString para delimitadores com vários caracteres ou quando os seus dados contiverem vírgulas. Use nullValues para mapear uma cadeia sentinela para nulo.
@ParameterizedTest
@CsvSource(value = {
"Alice | 30 | ADMIN",
"Bob | 25 | USER"
}, delimiterString = "|")
void test_roles(String name, int age, String role) { ... }@CsvFileSource: arquivos de dados externos
Carregue dados de teste de um arquivo CSV no caminho de classes. Isso é útil para grandes conjuntos de dados que deixariam o código de teste desorganizado.
@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: parâmetros complexos
@MethodSource chama um método de fábrica estático que retorna um Stream<Arguments>. Cada Arguments.of() corresponde a uma invocação do teste. Use-o para objetos complexos.
@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: testando todos os valores de enumeração
@EnumSource executa o teste uma vez para cada constante da enumeração. Use mode e names para incluir ou excluir valores específicos.
@ParameterizedTest
@EnumSource(value = UserStatus.class, mode = EnumSource.Mode.EXCLUDE, names = "DELETED")
void test_active_statuses(UserStatus status) {
assertTrue(notificationService.shouldNotify(status));
}@NullAndEmptySource
Atalho para testar entradas null e cadeias vazias. Combine @ValueSource com @NullSource + @EmptySource ou use a combinação @NullAndEmptySource.
@ParameterizedTest
@NullAndEmptySource
void null_and_empty_are_invalid(String input) {
assertFalse(validator.isValid(input));
}Nomes de exibição personalizados
Use name em @ParameterizedTest para formatar o nome de exibição do teste. Marcadores: {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) { ... }Combinando fontes com @ArgumentsSource
Implemente ArgumentsProvider para uma geração de argumentos totalmente personalizada — dados dinâmicos de bancos de dados, arquivos ou 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) { ... }Testes parametrizados para valores-limite
Teste sistematicamente as condições de limite: min-1, min, max, max+1. Os testes parametrizados tornam a cobertura dos limites legível e fácil de manter.
@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ção rápida
Qual tipo de retorno de @MethodSource fornece os argumentos de cada invocação do teste?
Recapitulação
Use @CsvSource para dados tabulares em linha, @MethodSource para objetos complexos, @EnumSource para todos os valores de enumeração e @NullAndEmptySource para casos-limite nulos ou vazios. Nomes personalizados com name= melhoram a legibilidade dos testes.
Perguntas Frequentes
A aula “Testes parametrizados com @CsvSource e @MethodSource” é grátis?
Sim — o texto completo de “Testes parametrizados com @CsvSource e @MethodSource” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Java Academy, atualize para CoddyKit PRO. O curso de Java Academy inclui 4 aulas no total.
O que vou aprender em “Testes parametrizados com @CsvSource e @MethodSource”?
Execute o mesmo teste com vários conjuntos de entrada usando @ParameterizedTest, @CsvSource e @MethodSource. Você pratica Java Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Java Academy?
Nenhuma experiência prévia é necessária. Java Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “Testes parametrizados com @CsvSource e @MethodSource”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Java Academy?
Sim. Cada aula de Java Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Testes parametrizados com @CsvSource e @MethodSource
- Mockito avançado: capturadores de argumentos e spies
- Fatias de teste do Spring Boot: @WebMvcTest e @DataJpaTest
- Testcontainers: testes de integração com banco de dados real