当前位置: 首页 > news >正文

System Rules:给 java.lang.System 写测试不再抓瞎

文章目录

  • System Rules:给 java.lang.System 写测试不再抓瞎
    • 1、它解决什么问题
    • 2、怎么用
    • 3、谁还在用
    • 4、适合谁

System Rules:给 java.lang.System 写测试不再抓瞎

System Rules 在 GitHub 上拿了 552 个 Star,数量不算炸裂,但活下来的开源工具里,能持续维护十多年的并不多。这个项目打从早期 JUnit 时代就在用,专门解决一桩很具体的烦人事:测试代码里碰java.lang.System的部分。

1、它解决什么问题

写 Java 单测时,凡是涉及System.exitSystem.getPropertySystem.setOutSystem.setErr、标准输入输出的场景,测试就难写。

直接调System.exit(0),测试进程直接没了。想验证控制台输出,得自己 替换System.out,写完还要在finally里还原回去,否则下一个测试就遭殃。环境变量System.getenv更麻烦,Java 早期版本里几乎是只读的。

System Rules 把这层麻烦全包了。它用 JUnit Rules 机制,每个测试结束自动还原现场,并提供断言接口。ExpectedSystemExit验证退出码,EnvironmentVariables临时改环境变量,ProvideSystemProperty覆盖系统属性,断言一气呵成。

2、怎么用

Maven 依赖加上,scope 设成 test:

<dependency><groupId>com.github.stefanbirkner</groupId><artifactId>system-rules</artifactId><version>1.19.0</version></dependency>

测试里直接@Rule一挂,剩下就是写断言。比如测一个调用System.exit(2)的方法:

publicclassMyTest{@RulepublicfinalExpectedSystemExitexit=ExpectedSystemExit.none();@TestpublicvoidexitsWithCode2(){exit.expectSystemExitWithStatus(2);myClass.doSomething();}}

不用手工管SecurityManager,不用try/finally还原状态。这就是它存在的意义。

3、谁还在用

System Rules 的核心是 JUnit 4 的 Rule 机制。JUnit 5(Jupiter)出来后,这套机制被 Extension 取代了。作者自己也提供了一个替代品 System Lambda,基于 Java 8,和测试框架解耦,能在 JUnit 5 和 TestNG 里用。

所以现状是这样:老项目里 JUnit 4 写的测试,System Rules 仍然是顺手的选择,迁移成本接近零;新项目用 JUnit 5,直接上 System Lambda 更合适。两个项目同一作者,API 风格相通。

4、适合谁

仍在维护 JUnit 4 老代码、测试里频繁碰java.lang.System的 Java 工程师,这是刚需。新项目用 JUnit 5 的,看一眼 System Lambda,别走这条老路。

CI 方面,作者在 Travis CI(Linux)和 AppVeyor(Windows)上跑了从 Java 6 到 10 的多版本测试。这点对老项目特别友好,毕竟还在用 Java 6 的项目不在少数。贡献代码时,照着.editorconfig写,跑一遍mvnw test,提 PR 就行。

不在少数。贡献代码时,照着.editorconfig写,跑一遍mvnw test,提 PR 就行。

http://www.jsqmd.com/news/1148286/

相关文章:

  • centos7.9版本升级ssh OpenSSH 9.8p1 源码 OpenSSL 1.1.1w 源码包以及安装升级回滚文档
  • 2007-2025年上市公司供应链长鞭效应测算数据集
  • 互联网大厂 Java 求职者面试:技术与幽默的对话
  • Nx:一套搞定 Monorepo 的构建加速方案
  • 杰理之做特殊按键只响应单击事件处理【篇】
  • wp2hugo:WordPress 到 Hugo 的迁移利器,301 Star
  • 百度网盘秒传脚本:3分钟掌握文件永久分享终极指南
  • 杰理之仅选择IIS 输出,通话mic 无声【篇】
  • Python 协程池设计模式:在 RAG 场景下复用 Embedding 请求的最佳实践
  • B站AI知识库插件:将收藏夹秒变智能知识库
  • 番茄小说本地化永久保存解决方案:fanqienovel-downloader全面指南
  • 【SkyWalking从入门到精通】第21篇:用SkyWalking排查慢服务——从蛛丝马迹到真相大白
  • DLSS Swapper:游戏性能优化的智能管家,一键解锁显卡全部潜能
  • 2026年AI大模型API中转站亲测报告 主流服务商性能与成本全维度硬核排名
  • 第27章:插件系统与 Plugin Daemon 协同样式
  • GLM 5.2 来袭:开源权重模型或致 AI 推理利润崩塌,成本最多降 50%!
  • ADP5350与PIC32MX675F256L在电源管理中的协同设计
  • Transformer 自注意力复杂度 O(n²d) 详解:从矩阵乘法到 PyTorch 源码逐行分析
  • 厦门大学LaTeX论文模板:学术规范自动化的架构解析与实施框架
  • 气动系统在工业应用中的风险防范
  • 云原生 Java 架构师的第一课 K8s+Docker+KubeSphere+DevOps 41-50
  • 2026 降AI率网站深度实测:亲测好用,毕业季必备宝典
  • GLM 5.2:开源模型正在杀死AI推理的暴利时代
  • 多 Agent 通信协议选型:gRPC、消息队列还是共享存储
  • DDrawCompat完整指南:让DirectX老游戏在现代Windows上焕发新生
  • PIC18F87J50开发板直流电机驱动与PID控制实战
  • Temu批量图片翻译实现方案解析
  • 多模态AI应用开发实战:从零搭建图像描述与问答系统
  • 2026商城网站建设哪家便宜,同价位下谁给的功能更多
  • 模型服务 A/B 测试:流量分桶要同时看延迟和业务指标