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

Google Truth:让 Java 测试断言读起来更像一句话

文章目录

  • Google Truth:让 Java 测试断言读起来更像一句话
    • 1、 这玩意儿是干嘛的
    • 2、 为什么要用它
    • 3、 怎么用
    • 4、 适合哪些场景

Google Truth:让 Java 测试断言读起来更像一句话

Truth 在 GitHub 上已经累积 2,786 Star,是 Google Guava 团队操刀维护的断言库。

它就做一件事,把测试里的断言写得更像人话,让失败信息一眼看明白哪里错了。

1、 这玩意儿是干嘛的

写 Java 测试的人对 JUnit 自带的assertEquals不陌生。一行assertEquals(expected, actual)写下来,断言干了什么一目了然,可一旦失败,堆栈里甩出来的信息只有 expected 和 actual 两个值,要弄清它们各自的来源就要回到测试代码翻上下文。

Truth 把断言拆成主语和谓语的结构。assertThat(actual).isEqualTo(expected)读起来就是一句话,assertThat(list).hasSize(5)直接说出意图。失败信息也跟着变样,会告诉你「value at index 3 was expected to be X but was Y」,定位点的颗粒比 JUnit 原生断言细得多。

它原生支持一长串 JDK 和 Guava 类型,集合、Map、Optional、Multimap、Table 这些都能直接断言,不用再写assertThat(map.size()).isEqualTo(5)这种绕一圈的写法。

2、 为什么要用它

写过测试断言的人多半遇到过这种场景:一段assertEquals(expected, actual)跑挂,message 里只给你两个对象 toString 后的值,你要自己对照哪个是哪个。复杂集合一上来,失败信息就是一大坨字串,肉眼比对两分钟起步。

Truth 处理这件事有自己的套路。对集合断言,它会在失败信息里给出索引、给出期望值、给出实际值,必要时告诉你哪些元素多出来、哪些少了。assertThat(multimap).hasSize(3)失败时,信息里会带上 multimap 当前内容,不用你再单独打 log 把对象 dump 一遍。

可读性之外,可扩展性也是它一条主线。自定义类型实现Subject接口就能挂进来,逻辑跟内置类型一脉相承。做内部库的人拿这个机制包一层,团队 DSL 就算立起来了。

3、 怎么用

Maven 工程加一行依赖:

<dependency><groupId>com.google.truth</groupId><artifactId>truth</artifactId><version>1.4.4</version></dependency>

Gradle 同理:

testImplementation 'com.google.truth:truth:1.4.4'

接着在测试里替换原来的断言:

importstaticcom.google.common.truth.Truth.assertThat;assertThat(actualResult).isEqualTo(expectedResult);assertThat(userList).hasSize(3);assertThat(userList).containsExactly(userA,userB,userC);assertThat(optionalValue).isPresent();assertThat(thrown).hasMessageThat().contains("not found");

API 风格跟 AssertJ 走的是同一条路,二者在 API 设计、可读性、扩展机制上的取舍接近。已有项目用 AssertJ 不必硬迁,新项目想跟 Guava 套件贴得近一点,Truth 的集成成本会比 AssertJ 低。

4、 适合哪些场景

  • Java 项目里写测试断言量很大、失败信息定位成本高的工程团队
  • 用 Guava 类型比较多的代码库,原生断言能省一层适配
  • 需要给内部领域对象写一套断言 DSL,希望挂在成熟框架上的场景

Google 自己的代码库里大头测试都跑在 Truth 上,Guava 团队亲自维护,节奏稳定。文档站点 truth.dev 上放了对比、扩展指南和已知类型清单,决定要不要上之前翻一遍就够判断。

ava 团队亲自维护,节奏稳定。文档站点 truth.dev 上放了对比、扩展指南和已知类型清单,决定要不要上之前翻一遍就够判断。

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

相关文章:

  • Function Calling 链路追踪:参数从 Prompt 到执行的全路径可视化
  • 三步打造PotPlayer多语言字幕翻译神器:免费实现外语视频无障碍观看
  • WE Learn网课助手:终极学习效率提升方案
  • 怎样高效获取百度文库文档:3步智能净化与PDF保存方案
  • openEuler Jenkins构建与安装检查终极指南:确保RPM包可正常构建和安装
  • 独立开发者的 CI/CD 选型:GitHub Actions 跑 AI 推理任务该怎么配
  • 《驾驭你的AI同事:WorkBuddy深度精通》005:2.2 对话状态管理的分布式实现
  • 合约审计 AI 助手本地部署:从模型下载到私有化扫描管线的完整搭建
  • 【SkyWalking从入门到精通】第16篇:SkyWalking UI使用手册:学会阅读指挥中心的作战地图
  • 深度解析猫抓cat-catch:浏览器资源嗅探扩展的架构设计与性能优化
  • 边缘端模型加载的“最后一字节“:NCNN ParamDict 参数解析与权重内存布局深度拆解
  • RAG架构进阶:从基础检索到GraphRAG
  • Agent 记忆系统设计:让智能体记得住、想得起、用得上
  • 终极音乐解锁指南:3分钟彻底摆脱加密格式限制
  • ADP5350与STM32F722VE的高效电源管理方案
  • Web3 AI Agent 框架对比:Eliza、Rig 与 LangChain 的 DApp 集成适配性分析
  • Rust 中的自引用结构体设计模式:Pin 投射与 Drop 检查的协同机制
  • GPU Kernel 级别的 Attention 融合实现:FlashAttention 在自定义推理引擎中的移植记录
  • 终极指南:3分钟掌握ncmdump本地无损转换网易云音乐NCM格式
  • 基于ISOM8710与STM32的高压隔离通信系统设计
  • OpenSPG报错合集:我遇到过的6个坑及解决方案(持续更新)
  • OpenPnP 2023/8/11版 vs 2022/8/01版:底部视觉检测稳定性对比与2个新功能解析
  • 中国车牌生成器:AI算法训练与智能交通系统的合规数据解决方案
  • JS逆向-断点调试与反绕过技巧
  • Rust async/await 的状态机实现:从 Future Trait 到零开销异步的秘密
  • PCB设计 布线规则
  • llama.cpp 的 Metal/CPU 混合推理调度:Apple Silicon 上的线程绑定与内存带宽优化
  • 终极指南:如何快速免费解锁网易云音乐NCM加密文件
  • AIOps从监控到自愈:构建具备闭环能力的智能运维Agent系统架构设计
  • 看门狗(IWDG/WWDG)+ CRC硬件校验 完全笔记【STM32F103 标准库实现】