JUnit 5 中获取测试类、测试方法及属性的注解

embedded/2025/2/9 5:40:02/

JUnit 5 中获取测试类、测试方法及属性的注解

JUnit 5 提供了强大的扩展机制,允许通过 ExtensionContext 获取测试类、测试方法及其属性上的注解信息。以下是具体实现方法和示例:


一、核心 API
  1. ExtensionContext

    • 提供测试执行的上下文信息,包括测试类、方法、注解等。
    • 通过扩展接口(如 BeforeEachCallbackParameterResolver)访问。
  2. AnnotatedElement

    • 表示可注解的元素(如类、方法、字段)。
    • 提供 getAnnotation()getAnnotations() 方法获取注解。

二、获取注解的步骤
  1. 实现扩展接口
    选择适合的扩展接口(如 BeforeEachCallbackTestExecutionCondition)。
  2. 通过 ExtensionContext 获取元素
    使用 getRequiredTestClass()getRequiredTestMethod() 等方法。
  3. 获取注解信息
    调用 getAnnotation()getAnnotations() 方法。

三、具体示例
示例 1:获取测试类上的注解
java">import org.junit.jupiter.api.extension.*;public class ClassAnnotationExtension implements BeforeEachCallback {@Overridepublic void beforeEach(ExtensionContext context) {// 获取测试类Class<?> testClass = context.getRequiredTestClass();// 获取类上的注解DisplayName displayName = testClass.getAnnotation(DisplayName.class);if (displayName != null) {System.out.println("测试类显示名称: " + displayName.value());}Tag tag = testClass.getAnnotation(Tag.class);if (tag != null) {System.out.println("测试类标签: " + tag.value());}}
}// 使用扩展
@DisplayName("用户服务测试")
@Tag("service")
@ExtendWith(ClassAnnotationExtension.class)
class UserServiceTest {@Testvoid testMethod() {Assertions.assertTrue(true);}
}

输出

测试类显示名称: 用户服务测试
测试类标签: service

示例 2:获取测试方法上的注解
java">import org.junit.jupiter.api.extension.*;public class MethodAnnotationExtension implements BeforeEachCallback {@Overridepublic void beforeEach(ExtensionContext context) {// 获取测试方法Method testMethod = context.getRequiredTestMethod();// 获取方法上的注解DisplayName displayName = testMethod.getAnnotation(DisplayName.class);if (displayName != null) {System.out.println("测试方法显示名称: " + displayName.value());}Tag tag = testMethod.getAnnotation(Tag.class);if (tag != null) {System.out.println("测试方法标签: " + tag.value());}}
}// 使用扩展
@ExtendWith(MethodAnnotationExtension.class)
class UserServiceTest {@Test@DisplayName("测试用户保存")@Tag("save")void testSaveUser() {Assertions.assertTrue(true);}
}

输出

测试方法显示名称: 测试用户保存
测试方法标签: save

示例 3:获取测试类属性上的注解
java">import org.junit.jupiter.api.extension.*;public class FieldAnnotationExtension implements BeforeEachCallback {@Overridepublic void beforeEach(ExtensionContext context) {// 获取测试类Class<?> testClass = context.getRequiredTestClass();// 遍历所有字段for (Field field : testClass.getDeclaredFields()) {// 获取字段上的注解Mock mock = field.getAnnotation(Mock.class);if (mock != null) {System.out.println("找到 Mock 字段: " + field.getName());}}}
}// 使用扩展
@ExtendWith(FieldAnnotationExtension.class)
class UserServiceTest {@Mockprivate UserRepository userRepository;@Testvoid testMethod() {Assertions.assertTrue(true);}
}

输出

找到 Mock 字段: userRepository

示例 4:获取所有注解
java">import org.junit.jupiter.api.extension.*;public class AllAnnotationsExtension implements BeforeEachCallback {@Overridepublic void beforeEach(ExtensionContext context) {// 获取测试类Class<?> testClass = context.getRequiredTestClass();// 获取类上的所有注解Annotation[] classAnnotations = testClass.getAnnotations();System.out.println("测试类注解: " + Arrays.toString(classAnnotations));// 获取测试方法Method testMethod = context.getRequiredTestMethod();// 获取方法上的所有注解Annotation[] methodAnnotations = testMethod.getAnnotations();System.out.println("测试方法注解: " + Arrays.toString(methodAnnotations));}
}// 使用扩展
@DisplayName("用户服务测试")
@Tag("service")
@ExtendWith(AllAnnotationsExtension.class)
class UserServiceTest {@Test@DisplayName("测试用户保存")@Tag("save")void testSaveUser() {Assertions.assertTrue(true);}
}

输出

测试类注解: [@org.junit.jupiter.api.DisplayName(value=用户服务测试), @org.junit.jupiter.api.Tag(value=service)]
测试方法注解: [@org.junit.jupiter.api.DisplayName(value=测试用户保存), @org.junit.jupiter.api.Tag(value=save)]

四、总结

通过 ExtensionContext 和反射 API,可以轻松获取测试类、方法和属性上的注解信息,适用于以下场景:

  • 动态配置测试:根据注解值调整测试行为。
  • 生成测试报告:提取注解信息生成详细报告。
  • 扩展功能:实现自定义注解处理器(如依赖注入、条件测试)。

建议结合具体需求选择合适的扩展接口,并注意注解的继承和组合特性。


http://www.ppmy.cn/embedded/160726.html

相关文章

Ollama 本地部署 体验 deepseek

下载安装ollama,选择模型 进行部署 # 管理员命令行 执行 ollama run deepseek-r1:70b浏览器访问http://ip:11434/ 返回 Ollama is runninghttp://ip:11434/v1/models 返回当前部署的模型数据 下载安装CherryStudio&#xff0c;本地对话UI 客户端 在设置中 修改API地址&#x…

A股level2高频数据分析20250205

A股level2高频数据分析20250205 通过Level2的逐笔成交与委托记录&#xff0c;这种高精度的毫秒级数据能够洞察诸多重要信息&#xff0c;包括庄家目的、误导性行为&#xff0c;使所有交易操作透明化。这对于分析高手的交易策略极为有益&#xff0c;对机器学习的研究也极具价值&…

matlab simulink 模拟光伏电池板在不同光照下的输出功率曲线

1、内容简介 略 matlab simulink 112-模拟光伏电池板在不同光照下的输出功率曲线可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略

java文件上传粗糙版

粗糙版图片上传 1.导入依赖 <dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.2</version> </dependency> 2.配置minio地址跟对应的桶 业务层实现类 import io.minio.MinioClient; /…

JDK 9新特性学习大纲

第1部分&#xff1a;引言与背景 第1章&#xff1a;JDK 9的诞生与目标 1.1 JDK 9的核心目标与设计哲学 1.2 JDK 9的重要更新概览 1.3 兼容性与升级策略 第2部分&#xff1a;模块化系统&#xff08;Project Jigsaw&#xff09; 第2章&#xff1a;模块化基础 2.1 模块化的背景…

四、GPIO中断实现按键功能

4.1 GPIO简介 输入输出&#xff08;I/O&#xff09;是一个非常重要的概念。I/O泛指所有类型的输入输出端口&#xff0c;包括单向的端口如逻辑门电路的输入输出管脚和双向的GPIO端口。而GPIO&#xff08;General-Purpose Input/Output&#xff09;则是一个常见的术语&#xff0c…

电脑重启后vscode快捷方式失效,找不到code.exe

今天打开电脑发现vscode的快捷方式失效了&#xff0c;提示code.exe被删除或移动。 解决方法 查看vscode安装目录&#xff0c;发现多了一个_文件夹&#xff0c;包括code.exe在内的其他文件都被移动到了这个文件夹下。 将里面内容都移动到microsoft vs code文件夹下&#xff0c…

Linux系统命令无法使用(glib库相关问题)

1.背景描述 Yum强制安装了一些软件&#xff0c;安装软件成功无报错&#xff0c;完成后不久突然发现系统出问题了&#xff0c;所有的命令无法使用了&#xff0c;如ls、mv、cat等基本命令报错。 relocation error&#xff1a; /lib64/libpthread.so.0: symbol_libc_dl_error_tsd …