参数化测试

@ValueSource — 简单值

import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.*; @ParameterizedTest @ValueSource(ints = {1, 2, 3, 5, 8, 13}) void fibonacciNumbers_arePositive(int n) { assertTrue(n > 0); } @ParameterizedTest @ValueSource(strings = {"[email protected]", "[email protected]"}) void validEmails_passValidation(String email) { assertTrue(EmailValidator.isValid(email)); }

@CsvSource 与 @CsvFileSource

@ParameterizedTest(name = "{0} + {1} = {2}") @CsvSource({ "1, 1, 2", "2, 3, 5", "10, -5, 5", }) void add_returnsExpected(int a, int b, int expected) { assertEquals(expected, calculator.add(a, b)); } // 从 CSV 文件加载(resources/test-data/calc-cases.csv) @ParameterizedTest @CsvFileSource(resources = "/test-data/calc-cases.csv", numLinesToSkip = 1) void csvFileTest(int input, int expected) { assertEquals(expected, transform(input)); }

@MethodSource — 复杂对象

import java.util.stream.Stream; import org.junit.jupiter.params.provider.Arguments; static Stream<Arguments> userProvider() { return Stream.of( Arguments.of("张三", 28, true), Arguments.of("李四", 17, false), Arguments.of("王五", 65, true) ); } @ParameterizedTest @MethodSource("userProvider") void userEligibility(String name, int age, boolean expectedEligible) { User user = new User(name, age); assertEquals(expectedEligible, service.isEligible(user)); }

@EnumSource

enum Status { ACTIVE, INACTIVE, SUSPENDED, PENDING } @ParameterizedTest @EnumSource(Status.class) void statusToString_isNotEmpty(Status status) { assertFalse(status.toString().isEmpty()); } @ParameterizedTest @EnumSource(value = Status.class, names = {"ACTIVE", "PENDING"}) void openStatuses_allowLogin(Status status) { assertTrue(authService.canLogin(status)); } @ParameterizedTest @EnumSource(value = Status.class, mode = EnumSource.Mode.EXCLUDE, names = {"SUSPENDED"}) void nonSuspended_canViewContent(Status status) { assertTrue(contentService.hasAccess(status)); }

@NullAndEmptySource

@ParameterizedTest @NullAndEmptySource @ValueSource(strings = {" ", "\t", "\n"}) void blankInputs_areRejected(String input) { assertFalse(validator.isValid(input)); }

数据源速查表

注解适用场景
@ValueSource基本类型和字符串
@CsvSource多参数内联 CSV
@CsvFileSource从外部 CSV 文件加载
@MethodSource复杂对象、流数据
@EnumSource枚举值测试
@NullAndEmptySource边界值:null 和空字符串
@ArgumentsSource自定义数据提供器