尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

System Rules:给 java.lang.System 写测试不再抓瞎
📅 发布时间:2026/7/8 14:38:51

文章目录

  • 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.exit、System.getProperty、System.setOut、System.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 就行。

相关新闻

  • B站AI知识库插件:将收藏夹秒变智能知识库
  • 2026年AI大模型API中转站亲测报告 主流服务商性能与成本全维度硬核排名
  • GLM 5.2 来袭:开源权重模型或致 AI 推理利润崩塌,成本最多降 50%!

最新新闻

  • YOLOv8 自定义数据集训练实战:COCO格式数据准备与关键参数调优
  • openEuler/ci-bot常见问题解答:新手到专家都需要的解决方案
  • 百度网盘解析工具实战指南:如何绕过限速获取真实下载链接
  • DocMate多语言翻译功能详解:如何实现中英技术文档的高质量互译
  • 孤能子视角:EIS压缩论
  • 3大痛点1个方案:LyricsX如何彻底解决macOS歌词同步难题

日新闻

  • PROPKA 3深度解析:蛋白质pKa预测的实战指南与算法原理
  • 微信小程序 globalData 监听:基于 Object.defineProperty 的 3 种实现方案对比
  • MySQL 8.0 数据清洗实战:3类异常值识别与 UPDATE/DELETE 批量处理

周新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号