0Pricing
Java Academy · Aula

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

  1. Testes parametrizados com @CsvSource e @MethodSource
  2. Mockito avançado: capturadores de argumentos e spies
  3. Fatias de teste do Spring Boot: @WebMvcTest e @DataJpaTest
  4. Testcontainers: testes de integração com banco de dados real
← Voltar para Java Academy