参数化测试
@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 | 自定义数据提供器 |