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.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 设成 testdependencygroupIdcom.github.stefanbirkner/groupIdartifactIdsystem-rules/artifactIdversion1.19.0/version/dependency测试里直接Rule一挂剩下就是写断言。比如测一个调用System.exit(2)的方法publicclassMyTest{RulepublicfinalExpectedSystemExitexitExpectedSystemExit.none();TestpublicvoidexitsWithCode2(){exit.expectSystemExitWithStatus(2);myClass.doSomething();}}不用手工管SecurityManager不用try/finally还原状态。这就是它存在的意义。3、谁还在用System Rules 的核心是 JUnit 4 的 Rule 机制。JUnit 5Jupiter出来后这套机制被 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 CILinux和 AppVeyorWindows上跑了从 Java 6 到 10 的多版本测试。这点对老项目特别友好毕竟还在用 Java 6 的项目不在少数。贡献代码时照着.editorconfig写跑一遍mvnw test提 PR 就行。不在少数。贡献代码时照着.editorconfig写跑一遍mvnw test提 PR 就行。