JUnit 5 中 @ParameterizedTest 是实现“一个测试方法、多组输入输出”的核心注解,替代 JUnit 4 的 @RunWith(Parameterized.class),支持 @ValueSource(基础类型)、@CsvSource(多字段组合)、@MethodSource(自定义数据源)及 @DisplayNamePattern(增强可读性)。

JUnit 5 中 @ParameterizedTest 是实现“一个测试方法、多组输入输出”的核心注解,它替代了 JUnit 4 的 @RunWith(Parameterized.class),更简洁、扩展性更强。
基础用法:配合 @ValueSource 提供简单类型数据
适合测试字符串、整数、布尔值等基本类型。JUnit 会为每组值单独执行一次测试方法:
- 方法必须用
@ParameterizedTest标记,不能用@Test - 参数类型需与
@ValueSource提供的类型一致(如int、String) - 方法参数名无关紧要,但类型和顺序必须匹配数据源
@ParameterizedTest
@ValueSource(strings = {"hello", "world", ""})
void shouldReturnTrueForNonEmptyString(String input) {
assertFalse(input.isEmpty()); // 注意:空字符串会失败,仅作演示
}
结构化数据:用 @CsvSource 或 @CsvFileSource 处理多字段组合
当需要同时传入多个参数(如输入 + 期望输出),@CsvSource 最常用,每组 CSV 字符串对应一次调用:
- 每行是一个测试用例,字段用逗号分隔,支持引号包裹含逗号的值
- 方法参数个数、类型、顺序必须与每行字段一一对应
- 可用
nullValues = "null"指定字符串 "null" 映射为 Javanull
@ParameterizedTest
@CsvSource({
"1, 2, 3",
"0, 0, 0",
"-1, 1, 0"
})
void addReturnsCorrectSum(int a, int b, int expected) {
assertEquals(expected, Calculator.add(a, b));
}
自定义数据源:用 @MethodSource 调用静态方法返回 Stream/Arguments
适用于复杂对象、动态生成数据或复用已有测试数据集合:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
- 被引用的方法必须是
static,返回Stream<Arguments>、Iterable<Arguments>或数组 -
Arguments.of(...)将多个值打包成一组参数 - 可结合工厂方法、外部配置或随机数据生成器灵活构造数据
@ParameterizedTest
@MethodSource("provideValidEmails")
void emailValidatorAcceptsValidInput(String email) {
assertTrue(EmailValidator.isValid(email));
}
private static Stream<Arguments> provideValidEmails() {
return Stream.of(
Arguments.of("test@example.com"),
Arguments.of("a.b+c@d-e.f"),
Arguments.of("user@sub.domain.co.uk")
);
}
增强可读性:用 @DisplayNamePattern 自定义每个参数化执行的显示名
默认显示名是 [1] xxx 这类编号形式,不利于快速定位失败用例。可通过模板提升可读性:
-
{index}表示执行序号(从 1 开始) -
{arguments}显示全部参数 toString() 结果 -
{0},{1}等表示第 1、2 个参数值(索引从 0 开始)
@ParameterizedTest
@DisplayNamePattern("#{index} => add({0}, {1}) = {2}")
@CsvSource({"1, 2, 3", "5, 7, 12"})
void addReturnsCorrectSum(int a, int b, int expected) {
assertEquals(expected, a + b);
}
运行时显示为:#1 => add(1, 2) = 3、#2 => add(5, 7) = 12,失败时一目了然。

















