@enumsource是junit 5中专为枚举设计的参数化测试注解,支持全量遍历、指定names、exclude/match_all模式筛选,但不支持null或空枚举。

在 JUnit 5 中,@EnumSource 是专为枚举设计的参数化测试数据提供方式,用起来简洁、类型安全,还能自动处理 null 和无效值。
基本用法:直接传整个枚举类
最常见写法是让 JUnit 自动遍历枚举所有常量:
- 只需在测试方法参数中声明对应枚举类型
- 用
@EnumSource(YourEnum.class)标注即可 - JUnit 会为每个枚举常量执行一次测试
例如:
@ParameterizedTest
@EnumSource(Season.class)
void testSeason(Season season) {
assertNotNull(season.name());
}
假设 Season 有 SPRING、SUMMER、FALL、WINTER 四个值,这个测试就会跑 4 次。
指定部分枚举值:用 names 属性
如果只想测其中几个常量,可以用 names 指定名称数组:
- 支持字符串字面量,大小写必须完全匹配枚举常量名
- 写错名称会编译通过但运行时报
JUnitException
示例:
@EnumSource(names = {"SPRING", "WINTER"})
这样只对 SPRING 和 WINTER 执行测试。
排除某些值:用 mode 和 value 配合
用 mode 参数可以反向筛选,比如跳过某些项:
-
@EnumSource(mode = EXCLUDE, names = {"UNKNOWN"})—— 排除指定名称 -
@EnumSource(mode = MATCH_ALL, names = ".*_TEST")—— 支持正则匹配(需注意枚举名是否符合) -
INCLUDE和EXCLUDE是最常用模式
注意点:null 和空枚举不被支持
@EnumSource 不允许传 null,也不支持空枚举类(即没有常量的枚举):
- 若枚举无任何常量,测试启动时会抛
PreconditionViolationException - 不能通过
names = {}来“禁用”测试,得改用其他数据源(如@ValueSource或自定义@MethodSource) - 想覆盖
null场景?得手动加一个@NullSource或用@MethodSource返回包含 null 的 Stream
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











