@BeforeAll 和 @AfterAll 必须是 static 的原因

news2024/11/27 20:34:25

@BeforeAll@AfterAll 必须是 static 的原因

  • 执行时机

    • @BeforeAll 方法在所有测试方法之前运行。
    • @AfterAll 方法在所有测试方法之后运行。
  • 实例化前/后的执行

    • 因为 @BeforeAll 是在所有测试方法执行之前运行的,所以它在任何一个测试实例创建之前就必须执行。
    • 类似地,@AfterAll 是在所有测试方法执行之后运行的,所以它在所有测试实例销毁之后执行。
  • 静态方法的特性

    • 静态方法属于类本身,而不是类的实例。因此,可以在没有创建类的实例的情况下调用静态方法。
    • 使用静态方法可以确保 @BeforeAll 在任何测试实例创建之前运行,@AfterAll 在所有测试实例销毁之后运行。

举例说明

假设你有一个测试类 ExampleTest,包含 @BeforeAll@AfterAll 方法:

public class ExampleTest {

    @BeforeAll
    static void setUpAll() {
        // 执行全局初始化代码
    }

    @AfterAll
    static void tearDownAll() {
        // 执行全局清理代码
    }

    @Test
    void testMethod1() {
        // 第一个测试方法
    }

    @Test
    void testMethod2() {
        // 第二个测试方法
    }
}
  • setUpAll() 方法在 testMethod1()testMethod2() 之前运行,用于执行全局初始化操作。
  • tearDownAll() 方法在所有测试方法执行之后运行,用于执行全局清理操作。

因为 setUpAll()tearDownAll() 是静态的,它们不依赖于 ExampleTest 的任何实例,因此能够在测试类实例化之前和销毁之后正确运行。

反例说明

如果 @BeforeAll@AfterAll 方法不是静态的:

public class ExampleTest {

    @BeforeAll
    void setUpAll() {
        // 不能正确运行
    }

    @AfterAll
    void tearDownAll() {
        // 不能正确运行
    }

    @Test
    void testMethod1() {
        // 第一个测试方法
    }

    @Test
    void testMethod2() {
        // 第二个测试方法
    }
}

image-20240608180932747

  • JUnit 将无法在创建 ExampleTest 实例之前调用 setUpAll() 方法,因为实例方法需要依赖对象实例。
  • 同样,在销毁所有 ExampleTest 实例之后,也无法调用 tearDownAll() 方法。

因此,使用静态方法确保了 @BeforeAll@AfterAll 方法能够在正确的时间点运行,而不依赖于测试类的实例化状态。

总结

因此,使用静态方法确保了 @BeforeAll@AfterAll 方法能够在正确的时间点运行,而不依赖于测试类的实例化状态。

总结

通过要求 @BeforeAll@AfterAll 方法是静态的,JUnit 能够在测试类实例化之前和销毁之后正确地运行全局初始化和清理代码,从而确保测试环境的一致性和可靠性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信机器人实现OCR识别录入数据

介绍 采用微信的hook插件,然后解析微信发来的数据图片,通过ocr识别 然后将数据落入execl表格中。同时有权限的人可以导出数据表格即可。 流程图 代码片 文本消息处理流程_robot.py elif msg.type 0x01: # 文本消息# 管理员列表dba_user_list [wxid_…

【C语言】函数递归 (包你懂的)

文章目录 1. 前言2. 递归的定义2.1 递归的思想2.2 递归的限制条件 3. 递归举例3.1 举例1:求n的阶乘3.1.1 分析和代码实现3.1.2 画图演示 3.2 举例2:顺序打印一个整数的每一位3.2.1 分析和代码实现3.2.3 画图演示 3.3 举例3:求第n个斐波那契数…

Unity动画录制工具在运行时录制和保存模型骨骼运动的方法录制动画给其他角色模型使用支持JSON、FBX等格式

如果您正在寻找一种在运行时录制和保存模型骨骼运动的方法,那么此插件是满足您需求的完美解决方案。 实时录制角色运动 将录制到的角色动作转为动画文件 将录制好的动作给新的角色模型使用,完美复制 支持导出FBX格式 操作简单,有按钮界面…

【原创】springboot+mysql村务档案管理系统设计与实现

个人主页:程序猿小小杨 个人简介:从事开发多年,Java、Php、Python、前端开发均有涉猎 博客内容:Java项目实战、项目演示、技术分享 文末有作者名片,希望和大家一起共同进步,你只管努力,剩下的交…

MySQL数据库操作基础(增删查改)

数据库操作基础(增删查改) 1.插入 1.1往数据表中插入一条数据 insert into 表名 values (值,值,值...)此处列出的这些值的数目和类型 要和表的相对应 1.2指定列插入 insert into 表名(列名) values (值);1.3一次插入多个记录 insert into 表名 values (值),(值)...一次插入…

深度学习500问——Chapter10:迁移学习(1)

文章目录 11.1 迁移学习基础知识 11.1.1 什么是迁移学习 11.1.2 为什么需要迁移学习 11.1.3 迁移学习的基本问题有哪些 11.1.4 迁移学习有哪些常用概念 11.1.5 迁移学习与传统机器学习有什么区别 11.1.6 迁移学习的核心及度量准则 11.1.7 迁移学习与其他概念的区别 11.1.8 什么…

达梦数据库相关SQL及适配Mysql配置总结

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…

Leetcode 力扣109. 有序链表转换二叉搜索树 (抖音号:708231408)

给定一个单链表的头节点 head ,其中的元素 按升序排序 ,将其转换为 平衡 二叉搜索树。 示例 1: 输入: head [-10,-3,0,5,9] 输出: [0,-3,9,-10,null,5] 解释: 一个可能的答案是[0,-3,9,-10,null,5],它表示所示的高…

每日一题——Python实现PAT乙级1042 字符统计(举一反三+思想解读+逐步优化)

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 优点 缺点和改进建议 时间复杂度分析 空间复杂度分析 改进后的代码 我…

关键字、保留字、标识符

关键字 关键字是被 Java 赋予了特定含义的英文单词。 关键字的字母全部小写。 保留字 现有的 Java 版本尚未使用,但是以后版本可能会作为关键字使用。自己命名标识符时需要避免使用这些保留字。 保留字有:byValue, cast, future, generic, inner, op…

数据并非都是正态分布:三种常见的统计分布及其应用

你有没有过这样的经历?使用一款减肥app,通过它的图表来监控自己的体重变化,并预测何时能达到理想体重。这款app预测我需要八年时间才能恢复到大学时的体重,这种不切实际的预测是因为应用使用了简单的线性模型来进行体重预测。这个…

【吊打面试官系列-Mysql面试题】BLOB 和 TEXT 有什么区别 ?

大家好,我是锋哥。今天分享关于 【BLOB 和 TEXT 有什么区别?】面试题,希望对大家有帮助; BLOB 和 TEXT 有什么区别 ? BLOB 是一个二进制对象,可以容纳可变数量的数据。TEXT 是一个不区分大小写的 BLOB。 1…

Java 语言概述 -- Java 语言的介绍、现在、过去与将来

大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 001 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进…

使用proteus仿真51单片机的流水灯实现

proteus介绍: proteus是一个十分便捷的用于电路仿真的软件,可以用于实现电路的设计、仿真、调试等。并且可以在对应的代码编辑区域,使用代码实现电路功能的仿真。 汇编语言介绍: 百度百科介绍如下: 汇编语言是培养…

Knife4j 生成 API 文档

文章目录 Knife4j 简介使用步骤Knife4j 常用注解的列表案例注意 Knife4j 简介 Knife4j 是一个增强的 Swagger 文档生成工具,提供了更加友好的界面和更多功能,使得 API 文档更加美观且易于使用。它是基于 Spring Boot 和 Swagger 进行封装的,…

【下篇】从 YOLOv1 到 YOLOv8 的 YOLO 物体检测模型历史

YOLO 型号之所以闻名遐迩,主要有两个原因:其速度和准确性令人印象深刻,而且能够快速、可靠地检测图像中的物体。上回我解释了YoloX, 今天从Yolov6开始。 YOLOv6:面向工业应用的单级物体检测框架 美团视觉人工智能事业部(Meituan Vision AI Department)于 2022 年 9 月在…

《精通ChatGPT:从入门到大师的Prompt指南》第4章:避免常见错误

第4章:避免常见错误 在使用ChatGPT进行Prompt编写时,常见的错误可能会大大影响生成内容的质量和准确性。本章将详细讨论这些错误,并提供如何避免它们的建议。 4.1 不明确的指令 在使用ChatGPT时,一个常见的问题是指令不够明确。…

Vue3中的常见组件通信之$attrs

Vue3中的常见组件通信之$attrs 概述 ​ 在vue3中常见的组件通信有props、mitt、v-model、 r e f s 、 refs、 refs、parent、provide、inject、pinia、slot等。不同的组件关系用不同的传递方式。常见的撘配形式如下表所示。 组件关系传递方式父传子1. props2. v-model3. $re…

LLVM Cpu0 新后端4

想好好熟悉一下llvm开发一个新后端都要干什么,于是参考了老师的系列文章: LLVM 后端实践笔记 代码在这里(还没来得及准备,先用网盘暂存一下): 链接: https://pan.baidu.com/s/1V_tZkt9uvxo5bnUufhMQ_Q?…

动态规划学习(分组背包)

分组背包的定义 分组背包是相比于01背包来讲,其就是多了一个组,给你n个组,每个组里有各自的物品,每个组里的物品只能选择一个,问你,选出来的最大价值是多少 这里我们的遍历顺序的三层循环,最外…