0

0

JUnit 5 中测试类实例生命周期的最佳实践

碧海醫心

碧海醫心

发布时间:2026-02-19 09:14:02

|

541人浏览过

|

来源于php中文网

原创

JUnit 5 中测试类实例生命周期的最佳实践

JUnit 5 默认为每个测试方法创建全新的测试类实例,因此多数场景下无需手动使用 @BeforeAll 或 @BeforeEach 初始化被测对象;直接在字段声明处初始化更简洁、安全且符合框架设计哲学。

junit 5 默认为每个测试方法创建全新的测试类实例,因此多数场景下无需手动使用 `@beforeall` 或 `@beforeeach` 初始化被测对象;直接在字段声明处初始化更简洁、安全且符合框架设计哲学。

在 JUnit 5(JUnit Jupiter)中,测试类的生命周期设计以隔离性可预测性为核心原则。框架默认采用 per-method 实例策略:即在执行每个 @Test 方法前,都会新建一个测试类的实例。这意味着所有非静态字段(如实例变量)天然具备“测试间隔离”特性——一个测试对字段状态的修改,绝不会影响其他测试。

因此,对于像 Calculator 这样无内部可变状态、构造开销小、不依赖外部资源的被测类,最推荐的做法是直接在字段声明处完成初始化:

紫东太初
紫东太初

中科院和武汉AI研究院推出的新一代大模型

下载
public class CalculatorShould {

    private final Calculator calculator = new Calculator(); // ✅ 推荐:简洁、线程安全、语义清晰

    @Test
    void calculatePriceForTwo() {
        Double price = calculator.calculatePrice(2);
        assertEquals(10.0, price); // 注意:assertEquals(double, double) 需用 double 类型
    }

    @Test
    void calculatePriceForFour() {
        Double price = calculator.calculatePrice(4);
        assertEquals(20.0, price);
    }
}

优势说明

  • 零样板代码:无需额外的 @BeforeAll/@BeforeEach 方法,降低维护成本;
  • 天然隔离:每个测试拥有独立的 calculator 实例,彻底规避静态共享状态引发的偶发失败;
  • 明确所有权:final 修饰符强化不可变语义,防止误赋值,提升可读性与健壮性;
  • 兼容并行执行:JUnit 5 支持并行测试(junit.jupiter.execution.parallel.enabled=true),静态共享对象在此模式下极易引发竞态,而实例字段完全规避该风险。

⚠️ 何时才需 @BeforeAll 或 @BeforeEach?

  • @BeforeAll:仅用于昂贵且线程安全的共享资源(如启动嵌入式数据库、加载大型配置文件),且必须配合 static 字段 + static 方法使用;
  • @BeforeEach:适用于需在每次测试前重置可变状态的场景(如清空 List、重置 Mock 行为、回滚事务等),而非单纯创建新对象。

反模式示例分析
原方案中使用 @BeforeAll + static Calculator 虽能运行,但存在隐患:

  • 若未来 Calculator 被扩展出内部状态(如缓存、计数器),静态实例将导致测试污染;
  • 违反 JUnit 的“测试自治”原则,增加调试难度;
  • 在并行执行时可能引发未定义行为。

? 总结
遵循 JUnit 5 的默认生命周期,优先采用“字段直接初始化”方式;将 @BeforeAll 和 @BeforeEach 留给真正需要跨测试共享或动态重置的场景。这不仅是最佳实践,更是写出可维护、可并行、可信赖单元测试的关键一步。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
软件测试常用工具
软件测试常用工具

软件测试常用工具有Selenium、JUnit、Appium、JMeter、LoadRunner、Postman、TestNG、LoadUI、SoapUI、Cucumber和Robot Framework等等。测试人员可以根据具体的测试需求和技术栈选择适合的工具,提高测试效率和准确性 。

449

2023.10.13

java测试工具有哪些
java测试工具有哪些

java测试工具有JUnit、TestNG、Mockito、Selenium、Apache JMeter和Cucumber。php还给大家带来了java有关的教程,欢迎大家前来学习阅读,希望对大家能有所帮助。

310

2023.10.23

Java 单元测试
Java 单元测试

本专题聚焦 Java 在软件测试与持续集成流程中的实战应用,系统讲解 JUnit 单元测试框架、Mock 数据、集成测试、代码覆盖率分析、Maven 测试配置、CI/CD 流水线搭建(Jenkins、GitHub Actions)等关键内容。通过实战案例(如企业级项目自动化测试、持续交付流程搭建),帮助学习者掌握 Java 项目质量保障与自动化交付的完整体系。

22

2025.10.24

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

675

2023.08.10

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

374

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2093

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

355

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

259

2023.09.05

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

660

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号