详细分析Java中的@ExtendWith注解(附Demo)

本文详细比较了Spring中的@Around注解和@ExtendWith注解在单元测试中的用途,分别介绍了它们在AOP中的角色、应用场景、功能和使用方式,以及@ExtendWith在JUnit5中的具体用法和一个示例。
摘要由CSDN通过智能技术生成

前言

有点类似Spring的增强类
与原先此注解有些像 详细分析Spring中的@Around注解(附Demo)

具体这两者 差异如下:

特性@ExtendWith注解@Around注解
框架/库JUnit 5Spring 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);
    }
}

截图如下:

在这里插入图片描述

  • 24
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农研究僧

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值