TestInfo 是 JUnit 5 提供的轻量级接口,用于在测试生命周期方法或测试方法中获取当前测试的元数据信息,如显示名、所属类、标签等,但不支持反射操作。

TestInfo 是 JUnit 5 提供的轻量级接口,用于在测试生命周期方法(如 @BeforeEach、@AfterEach)或测试方法中获取当前测试的元数据信息,比如方法名、显示名、所属类、关联标签等。它不提供反射能力(如获取注解或参数),但能快速拿到运行时可见的标识性信息。
TestInfo 能获取哪些信息
常见可用字段包括:
-
getDisplayName():返回测试的显示名称(来自
@DisplayName或默认生成的名称,如testAddition()) -
getTestMethod():返回
Method对象(⚠️注意:仅当在@Test方法内注入时才非 null;在@BeforeEach中调用会抛异常) -
getTestClass():返回当前测试类的
Class对象 -
getTags():返回该测试方法或类上声明的所有
@Tag值(Set<String>) - toString():调试时可直接打印,含类名+方法名+标签等摘要
如何正确注入和使用 TestInfo
JUnit 5 自动解析 TestInfo 类型参数,无需额外配置。只需将其作为方法参数声明即可:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
@BeforeEach
void setUp(TestInfo testInfo) {
System.out.println("正在执行:" + testInfo.getDisplayName());
System.out.println("所属类:" + testInfo.getTestClass().getSimpleName());
System.out.println("标签:" + testInfo.getTags());
}注意:testInfo.getTestMethod() 在 @BeforeEach 中不可用(因尚未进入具体测试方法),若需反射操作(如读取自定义注解),应改用 ExtensionContext。
结合 @DisplayName 和 @Tag 的实际效果
假设测试方法写成:
@DisplayName("验证用户登录成功场景")
@Tag("smoke")
@Test
void loginWithValidCredentials() { /* ... */ }那么 testInfo.getDisplayName() 返回 "验证用户登录成功场景",testInfo.getTags() 返回 [smoke]。若未加 @DisplayName,则默认为方法名 loginWithValidCredentials。
常见误区提醒
-
TestInfo不是为反射设计的——它不暴露Method实例给生命周期方法,别试图从中调用getAnnotation() - 不能在
@BeforeAll中使用getTestMethod()(无当前测试方法上下文) - 标签继承:类上声明的
@Tag会自动合并到其所有测试方法的getTags()结果中

















