题目重点:比较 JUnit、TestNG 与 Spock,并区分断言、mock 和真实集成测试。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 可选择三种 JVM 测试框架作为练习;Spock 通常使用 Groovy。个人使用经验只能引用真实经历。
解题路线
- 先描述被测单元与依赖:纯规则用参数化例子,边界错误用精确断言,有状态服务验证可观察行为。
- JUnit 和 TestNG 都提供测试组织与执行能力;Spock 用 specification 风格组织 given/when/then。比较参数化、生命周期和团队工具链,比背品牌更有用。
- Mockito 属于 mock 工具,不宜冒充独立的测试运行框架。用替身隔离昂贵或不确定的依赖,但数据库一致性、协议与迁移仍需集成测试。
- 选一个真实测试说明它捕获过什么错误、如何避免脆弱实现断言、如何在 CI 运行。没有使用过的框架明确说明了解而未实践。
手动走一遍
转账测试给 A=10/B=0,调用转5,断言两个余额和总额不变;不足余额时断言状态完全未修改。只 mock repository 并检查 save 调用次数,不能证明 SQL 事务真的原子,应补真实数据库集成场景。
规模与取舍
测试数量不直接代表质量;控制隔离、稳定性与 CI 总时间。参数化场景随状态空间扩大,优先风险与边界。
易错点与追问
容易失分的边界
- 把 Mockito 当第三个 runner。
- 只验证私有方法/调用次数。
- 编造自己使用过的框架。
继续深挖
- 如何测试并发与时间?
- 如何处理 flaky test 而不直接永久禁用?
