Software Engineer · 语言与工程基础

Java 单元测试框架:用测试边界解释选择与经验

比较 JUnit、TestNG 与 Spock,并区分断言、mock 和真实集成测试。

题目重点:比较 JUnit、TestNG 与 Spock,并区分断言、mock 和真实集成测试。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 可选择三种 JVM 测试框架作为练习;Spock 通常使用 Groovy。个人使用经验只能引用真实经历。

解题路线

  1. 先描述被测单元与依赖:纯规则用参数化例子,边界错误用精确断言,有状态服务验证可观察行为。
  2. JUnit 和 TestNG 都提供测试组织与执行能力;Spock 用 specification 风格组织 given/when/then。比较参数化、生命周期和团队工具链,比背品牌更有用。
  3. Mockito 属于 mock 工具,不宜冒充独立的测试运行框架。用替身隔离昂贵或不确定的依赖,但数据库一致性、协议与迁移仍需集成测试。
  4. 选一个真实测试说明它捕获过什么错误、如何避免脆弱实现断言、如何在 CI 运行。没有使用过的框架明确说明了解而未实践。

手动走一遍

转账测试给 A=10/B=0,调用转5,断言两个余额和总额不变;不足余额时断言状态完全未修改。只 mock repository 并检查 save 调用次数,不能证明 SQL 事务真的原子,应补真实数据库集成场景。

规模与取舍

测试数量不直接代表质量;控制隔离、稳定性与 CI 总时间。参数化场景随状态空间扩大,优先风险与边界。

易错点与追问

容易失分的边界

  • 把 Mockito 当第三个 runner。
  • 只验证私有方法/调用次数。
  • 编造自己使用过的框架。

继续深挖

  • 如何测试并发与时间?
  • 如何处理 flaky test 而不直接永久禁用?
✓已复制微信号!