首页 > 其他分享 >使用Junit5 时,@ExtendsWith 注解的作用是什么

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

时间:2024-09-21 16:50:35浏览次数:1  
标签:扩展 ExtendWith ExtendsWith 测试 注解 Junit5 class 测试方法

在使用 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 {

    @Override
    public 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 {

    @Test
    void 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 {
    
        @Mock
        MyService myService;
    
        @InjectMocks
        MyController myController;
    
        @Test
        void testService() {
            // 测试代码
        }
    }
    
  2. SpringExtension: 当使用 Spring 框架进行集成测试时,SpringExtension 允许将 Spring 的上下文注入到测试类中。

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

总结

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

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

标签:扩展,ExtendWith,ExtendsWith,测试,注解,Junit5,class,测试方法
From: https://www.cnblogs.com/gongchengship/p/18424219

相关文章

  • spring @cacheable 注解使用spel表达式
    这里主要讲一下复杂的spel表达式,简单的不写了解析集合集合需要先自定义一个方法,比如getAuthorsName,然后在注解里通过root.target.getAuthorsName把方法引用进去publicclassBookService{publicStringgetAuthorsName(List<Author>authors){returnauthors.s......
  • 轻松实现XSS防御(注解和过滤器)
    一、XSS概述XSS,全称为跨站脚本(Cross-SiteScripting),是一种常见的网络手段。它主要利用了Web应用程序对用户输入验证的不足,允许者将恶意脚本注入到其他用户浏览的网页中。1.1XSS的定义XSS是指者在Web页面的输入数据中插入恶意脚本,当其他用户浏览该页面时,这些脚本就会在用户的浏......
  • 自定义日志注解,保存信息到数据库
    定义日志注解importjava.lang.annotation.*;/***@authorwzw*@version1.0*@Date2023-2-1717:31:19*/@Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic@interfaceLog{/***描述*@return*/......
  • @RequestMapping 和 @GetMapping等子注解的区别及其用法
    常用的请求映射注解介绍@GetMapping用于处理HTTPGET请求。等价于 @RequestMapping(method=RequestMethod.GET)。1@GetMapping("/path")2publicStringhandleGetRequest(){3return"GETrequesthandled";4}@PostMapping用于处理HTTPPOST请求。等价于 ......
  • Sa-Token的v1.39.0自定义鉴权注解怎么玩
    个人博客:无奈何杨(wnhyang)个人语雀:wnhyang共享语雀:在线知识共享Github:wnhyang-Overview简介在Sa-Token最新的v1.39.0版本的更新日志中有这么一句话核心:升级:重构注解鉴权底层,支持自定义鉴权注解了。[重要]正巧最近有看一个关于鉴权的东西,顺便看一下吧!常见的自定义注解鉴权目标:对于......
  • Java基础学习(七)(枚举和注解)
    一、枚举枚举是一组常量的集合。枚举属于一种特殊的类,里面只包含一组有限的特定的对象。有两种实现方式:①自定义类实现枚举  ②使用enum关键字实现枚举1.1自定义类实现枚举不需要提供set方法,因为枚举对象值通常为只读对枚举对象/属性使用final+static共同修饰,实现底......
  • Java Web项目使用注解和面向切面编程优雅的记录操作日志
    1.背景在我们的项目中,记录模块的操作日志比较麻烦,需要通过定义对象,获取需要记录的日志内容,最后插入到日志操作表等一系列动作才能完成。该方案既笨拙,使用也不方便,使得代码中存在大量冗余。因此,想要找到一种方便又优雅的方案解决该问题,使得日志模块既不影响业务逻辑的执行,又能......
  • Spring4-IoC2-基于注解管理bean
    目录开启组件扫描使用注解定义bean@Autowired注入场景一:属性注入场景二:set注入场景三:构造方法注入场景四:形参注入场景五:只有一个构造函数,无注解场景六:@Autowired和@Qualifier注解联合@Resource注入场景一:根据name注入场景二:name未知注入场景三:其他情况Spring全注......
  • 轻松掌握Spring组件扫描:@Component注解的实用指南,有两下子!
    ......
  • Spring webflux注解:提供全面的JPA注解应用案例(必须收藏)
    SpringWebFlux,Spring生态中的响应式Web框架,通过其独特的非阻塞I/O模型,引领了JavaWeb开发新潮流。它利用@EnableWebFlux注解激活响应式编程模式,结合@RestController和@RequestMapping注解,为开发人员提供了构建异步、事件驱动Web应用的能力。SpringWebFlux背后的ProjectReactor......