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

server/2025/2/12 22:37:05/

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/server/167167.html

相关文章

了解数据链路层

目录 一、认识以太网 二、以太网帧格式 三、认识MTU MTU对IP协议的影响 MTU对UDP协议的影响 MTU对TCP协议的影响 四、ARP协议 ARP协议的作用 ARP协议的工作流程 数据链路层的作用是解决如何正确在链路内找到和传输数据给局域网内的设备。数据链路层有很多种协议&#x…

git客户端版本下载

1. 访问官方网站&#xff1a;您可以在git官方网站&#xff08;https://git-scm.com&#xff09;上找到git软件最新稳定版下载链接。 2.如果需要下载其它版本&#xff0c;可访https://github.com/git-for-windows/git/releases选择想要的版本下载。

石英表与机械表的世纪之争(Quartz vs. Mechanical Watches):瑞士钟表业的危机与重生(中英双语)

石英表与机械表的世纪之争&#xff1a;瑞士钟表业的危机与重生 本文灵感来源&#xff1a; 日本制造业在战后复兴&#xff0c;日本精工公司作为日本制造业的代表&#xff0c;研究出了如何将石英制作成音叉的方法。1969年&#xff0c;精工公司推出了世界上第一款石英水晶天文台表…

嵌入式linux系统中VIM编辑工具用法与GCC参数详解

大家好,今天主要给大家分享一下,如何使用linux系统中的VIM编辑工具和GCC的参数详解。 第一:安装VIM 命令:sudo apt get install vim 第二:工作模式 普通模式:打开一个文件时的默认模式,按ESC返回普通模式 插入模式:i/o/a进入插入模式,不同在于在光标前后插入 可视…

使用 Visual Studio Code (VS Code) 开发 Python 图形界面程序

安装Python、VS Code Documentation for Visual Studio Code Python Releases for Windows | Python.org 更新pip >python.exe -m pip install --upgrade pip Requirement already satisfied: pip in c:\users\xxx\appdata\local\programs\python\python312\lib\site-pa…

纯前端检查是否有发版,并提示用户刷新

纯前端如何实现检查是否有新版本发布&#xff0c;并提示用户刷新页面。用户之前询问过云服务器和本地代码同步的问题&#xff0c;现在转向前端部署后的版本检查&#xff0c;可能是在实际开发中遇到了版本更新的需求&#xff0c;需要确保用户能及时获取最新版本。 首先&#xff…

数据分析对企业有什么价值

数据分析是工具&#xff0c;可以理解为一把刀&#xff0c;这把刀能够产生什么样的价值主要在于使用者。 一、基于财务的数据分析价值 基于财务数据&#xff0c;数据分析师可以进行多方面的分析&#xff0c;以下是一些常见的分析类型&#xff1a; 1. 财务报表分析 趋势分析&…

自动驾驶超声波雷达:市场潜力爆发,引领未来出行新趋势

在自动驾驶技术的飞速发展中&#xff0c;自动驾驶超声波雷达作为一项关键技术&#xff0c;正逐渐崭露头角&#xff0c;其重要性及市场增长潜力不容忽视。本文将深入探讨自动驾驶超声波雷达的重要性、市场增长趋势、显著优势、全球市场规模与驱动因素、主要市场参与者以及不同地…