前言
有点类似Spring的增强类
与原先此注解有些像 详细分析Spring中的@Around注解(附Demo)
具体这两者 差异如下:
特性 | @ExtendWith注解 | @Around注解 |
---|---|---|
框架/库 | JUnit 5 | Spring AOP |
用途 | 用于加载自定义测试扩展 | 用于定义方法级别的环绕增强 |
扩展类型 | 可以是实现Extension接口的类,也可以是使用@ExtendWith注解声明的类 | 用于定义切面,横切关注点可以是方法执行、参数传递、异常处理等 |
应用领域 | 主要用于单元测试 | 主要用于业务逻辑的增强,例如事务管理、日志记录、性能监控等 |
功能定位 | 与测试框架紧密相关 | 与Spring容器紧密相关 |
生命周期管理 | 主要用于测试框架的功能扩展,如测试前的准备工作、测试中间的操作、测试后的清理等 | 主要用于横跨多个方法或类的增强,可以控制方法执行前后的行为 |
使用方式 | 使用注解声明扩展类,通过注解加载扩展 | 使用注解声明切面,通过Spring的AOP机制实现 |
对于Java的相关知识推荐阅读:java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)
1. 基本知识
在Java中,@ExtendWith
注解通常与JUnit 5一起使用,用于扩展JUnit测试框架
对于上述的话解读如下:
- JUnit 5:JUnit是Java中最流行的单元测试框架之一,引入一些新的特性和改进,包括对Java 8的支持以及更灵活的扩展机制
- @ExtendWith注解:
@ExtendWith
是JUnit 5提供的一个注解,用于加载自定义扩展
扩展可以是实现Extension接口的类,也可以是使用@ExtendWith
注解声明的类
起源码如下:
@Target({ ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Repeatable(Extensions.class)
@API(status = STABLE, since = "5.0")
public @interface ExtendWith {
/**
* An array of one or more {@link Extension} classes to register.
*/
Class<? extends Extension>[] value();
}
解读如下:
@Target
指定了目标元素类型,可以应用于类、方法、字段和参数@Retention
指定@ExtendWith
注解在运行时可见,可运行时通过反射来获取@Documented
指示编译器将@ExtendWith
注解包含在生成的Java文档中,以便在文档中记录该注解@Inherited
指示子类可以继承父类上的@ExtendWith
注解@Repeatable
指定@ExtendWith
注解可以重复应用于同一元素,而不必使用容器注解来容纳多个@ExtendWith
注解@API(status = STABLE, since = "5.0")
自定义注解,指示@ExtendWith
注解的稳定性和引入版本,表示@ExtendWith
注解在JUnit 5.0版本中引入,并且在稳定状态下Class<? extends Extension>[] value();
@ExtendWith
注解的一个属性,指定一个或多个要注册的扩展类
2. Demo
具体Demo展示如下:
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.BeforeTestExecutionCallback;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.extension.Extension;
import org.junit.jupiter.api.extension.ExtensionContext;
// 定义一个自定义的JUnit扩展,用于在测试开始前输出日志
class CustomExtension implements BeforeTestExecutionCallback {
@Override
public void beforeTestExecution(ExtensionContext context) {
System.out.println("Before Test Execution");
}
}
// 使用@ExtendWith注解加载自定义扩展
@ExtendWith(CustomExtension.class)
public class test {
@Test
void test1() {
System.out.println("Test 1");
Assertions.assertTrue(true);
}
@Test
void test2() {
System.out.println("Test 2");
Assertions.assertEquals(2, 1 + 1);
}
}
截图如下: