使用Junit5 时,@ExtendsWith 注解的作用是什么

news/2024/9/21 16:59:34/文章来源:https://www.cnblogs.com/gongchengship/p/18424219

在使用 JUnit 5 时,@ExtendWith 注解用于扩展测试类的功能,使你能够通过加载自定义的扩展类,增强测试用例的行为。JUnit 5 引入了扩展模型(Extension Model)@ExtendWith 是这一模型的核心注解,允许你在测试执行过程中通过扩展类进行额外的操作,如注入依赖、拦截生命周期事件、修改测试方法执行流程等。

@ExtendWith 注解的作用

@ExtendWith 的主要功能是注册一个或多个扩展类(Extension Classes)。这些扩展类实现了 JUnit 5 的扩展接口(如 BeforeEachCallback, AfterEachCallback 等),从而可以在测试的不同生命周期阶段执行额外逻辑。该注解可以用于测试类或测试方法上。

扩展模型的作用场景

扩展模型为测试提供了非常强大的功能,常见的应用场景包括:

  1. 依赖注入: 使用扩展类注入测试所需的资源或对象,类似于 Spring 的依赖注入。
  2. 生命周期管理: 在测试类的生命周期中的不同阶段(如测试前准备、测试后清理)执行自定义操作。
  3. Mock 对象注入: 可以通过扩展类集成类似于 Mockito 的 Mock 框架,自动生成 Mock 对象。
  4. 参数化测试: 提供自定义的参数解析和注入逻辑。
  5. 自定义断言: 扩展测试行为,生成定制化的断言或日志。

如何使用 @ExtendWith

1. 基本用法

假设你有一个自定义扩展类 MyCustomExtension,它实现了 JUnit 5 的扩展接口:

import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.extension.BeforeEachCallback;public class MyCustomExtension implements BeforeEachCallback {@Overridepublic void beforeEach(ExtensionContext context) throws Exception {System.out.println("Before each test");}
}

然后在测试类中使用 @ExtendWith 注解来注册该扩展:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;@ExtendWith(MyCustomExtension.class)
public class MyTest {@Testvoid testExample() {System.out.println("Test is running");}
}

输出:

Before each test
Test is running

在这个例子中,MyCustomExtensionbeforeEach 方法会在每个测试方法执行前运行。

2. 与多个扩展一起使用

你可以通过 @ExtendWith 注解注册多个扩展类:

@ExtendWith({MyCustomExtension.class, AnotherExtension.class})
public class MyTest {// 测试代码
}

这样可以同时使用多个扩展,分别处理不同的测试逻辑。

3. 在测试方法上使用

除了在类级别使用 @ExtendWith,你还可以在测试方法级别使用,作用范围仅限于指定的方法:

@ExtendWith(MyCustomExtension.class)
public class MyTest {@Test@ExtendWith(AnotherExtension.class) // 仅对这个方法生效void testExample() {// 测试代码}
}

常用扩展接口

JUnit 5 提供了许多内置的扩展接口供你实现,下面是一些常用的扩展接口:

  1. BeforeAllCallbackAfterAllCallback: 在所有测试方法执行前或执行后执行逻辑。
  2. BeforeEachCallbackAfterEachCallback: 在每个测试方法执行前或执行后执行逻辑。
  3. TestExecutionExceptionHandler: 拦截和处理测试执行中的异常。
  4. ParameterResolver: 提供参数解析逻辑,允许在测试方法中注入参数。
  5. ExecutionCondition: 动态控制是否执行测试方法或测试类(例如基于运行环境跳过某些测试)。

常见的扩展示例

  1. MockitoExtension: 当你使用 Mockito 进行单元测试时,MockitoExtension 通过 @ExtendWith 注解可以自动管理 @Mock 注解和 @InjectMocks 的对象。

    @ExtendWith(MockitoExtension.class)
    public class MyMockTest {@MockMyService myService;@InjectMocksMyController myController;@Testvoid testService() {// 测试代码}
    }
    
  2. SpringExtension: 当使用 Spring 框架进行集成测试时,SpringExtension 允许将 Spring 的上下文注入到测试类中。

    @ExtendWith(SpringExtension.class)
    @ContextConfiguration(classes = MyConfig.class)
    public class MySpringTest {@AutowiredMyService myService;@Testvoid testService() {// 使用 Spring 注入的 myService}
    }
    

总结

  • @ExtendWith 的作用: 用于注册扩展类,增强测试的功能,通过扩展机制定制化测试的执行流程。
  • 应用场景: 依赖注入、Mock 框架集成、生命周期管理、参数化测试、自定义断言等。
  • 扩展类: 可以实现 JUnit 5 提供的扩展接口(如 BeforeEachCallbackAfterEachCallback 等),以实现定制化的逻辑。

通过 @ExtendWith,你可以大幅增强 JUnit 5 的功能,适应复杂的测试需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/801087.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cortex-A7 MPCore 架构

Cortex-A7 MPCore 架构 1)Cortex-A7 MPCore 简介 Cortex-A7 MPcore 处理器支持 1~4 核,通常是和 Cortex-A15 组成 big.LITTLE 架构的,Cortex-A15 作为大核负责高性能运算,比如玩游戏啥的, Cortex-A7 负责普通应用,因为 CortexA7 省电。 Cortex-A7 本身性能也不弱,不要…

Zlmedia搭建简记

进入新公司之后,发现他们的视频播放使用的是ZlmediaKit这个工具,自己尝试使用了一下发现很好用,于是在自己机器上搭建了一个服务玩玩。 因为没有在线的摄像头,所以这里采用的是ffmpeg推送mp4文件作为视频流输入,推送到zlmedia服务,再利用zlmedia本身所带的拉流服务,最终…

C 风格字符串函数

▲《C++ Primer》 P109 我们无法保证 c_str 函数返回的数组一直有效,事实上,如果后续的操作改变了 string 的值就可能让之前返回的数组失去效用。 WARNING: 如果执行完 c_str() 函数后程序想一直都能使用其返回的数组,最好将该数组重新拷贝一份。

基于IDF的ESP32S3-LVGL DEMO移植

简介 ESP32-32出色的性价比,较好的性能与内存空间,可以好利用来完成GUI显示库的加载 LVGL LVGL是一款比较流行的致力于MCU与MPU创建漂亮UI的嵌入式图形库,免费且开源。 硬件 硬件采用的是正点原子的ESP32-S3 屏幕使用的是SPI通信方式,配合IO口控制(RST,A0),来实现LCD屏幕…

nginx: 按ip地址限流

一,以固定的速度提供服务 语法: 例子 limit_req_zone $binary_remote_addr zone=test:10m rate=2r/s;server { location / { limit_req zone=test; }} 语法: imit_req_zone 用于设置限流和共享内存区域的参数,格式为: limit_req_zone key zone rate。 key: 定…

Free5GC源码研究(2) - 单个NF的软件架构

前文我们总览了free5gc的总体软件架构。整一个free5gc系统又由几个NF(Network Function)组成,所以本文继续深入研究单个NF的软件架构。要研究NF的软件架构,最直接的方式是找一个简单的NF来回观摩。free5gc/ausf算是比较简单的一个,然而我发现了一个更简单的NF,叫做andy89…

一,初始 MyBatis-Plus

一,初始 MyBatis-Plus @目录一,初始 MyBatis-Plus1. MyBatis-Plus 的概述2. 入门配置第一个 MyBatis-Plus 案例3. 补充说明:3.1 通用 Mapper 接口介绍3.1.1 Mapper 接口的 “增删改查”3.1.1.1 查询所有记录3.1.1.2 插入一条数据3.1.1.3 删除一条数据3.1.1.4 更新一条数据3.…

[神经网络与深度学习笔记]LDA降维

LDA降维 LinearDiscriminant Analysis 线性判别分析,是一种有监督的线性降维算法。与PCA保持数据信息不同,LDA的目标是将原始数据投影到低维空间,尽量使同一类的数据聚集,不同类的数据尽可能分散 步骤:计算类内散度矩阵\(S_b\) 计算类间散度矩阵\(S_w\) 计算矩阵\(S_w^{-1…

C++ 指针和迭代器支持的操作

▲ 《C++ Primer》 P96 指针也都支持上面的操作。

代码整洁之道--读书笔记(14)

代码整洁之道简介: 本书是编程大师“Bob 大叔”40余年编程生涯的心得体会的总结,讲解要成为真正专业的程序员需要具备什么样的态度,需要遵循什么样的原则,需要采取什么样的行动。作者以自己以及身边的同事走过的弯路、犯过的错误为例,意在为后来者引路,助其职业生涯迈上更…

hexo安装后报错hexo 不是内部或外部命令,也不是可运行的程序 或批处理文件。

hexo问题 之前利用hexo和gitee搭建了一个博客,但是最近gitee的gitpage停止服务了,便想着在github上搭建一个。 在到安装hexo这一步的时候,一直报错hexo 不是内部或外部命令,也不是可运行的程序 或批处理文件。 我的所有安装步骤和环境变量发现都没有错,反复配置后去找了一…

跑冒滴漏监测系统

跑冒滴漏监测系统应用计算机视觉和深度学习技术对危化品生产区域实时检测,当检测到液体泄露时,立即抓拍存档告警并回传给后台监控平台方便人员及时处理,提高图像数据的实时监控效率。跑冒滴漏监测系统7*24小时不间断对监控画面实时分析监测,避免意外事故发生,同时降低人力…