使用Stub模拟依赖是否会引发单元测试的脆弱性问题?
使用Stub会让测试变得脆弱吗?
答案是:不会——Stub本身不是测试脆弱的根源,问题出在测试是否绑定了被测试系统(SUT)的实现细节。
根据Vladimir Khorikov在《单元测试》中的观点,测试失去重构抗性、变得脆弱的核心原因,是测试把关注点放在了SUT的内部实现上,而非它的外部可见行为。
举你提到的场景为例:
- 当你为IDependency的
Method A创建Stub并预设响应,同时测试硬编码验证SUT调用了Method A时,一旦重构SUT改用Method B(外部行为完全不变),测试就会失败。这时候测试成了重构的阻碍,显得脆弱。 - 但如果你的测试只关注SUT的最终输出(比如返回值、对外部资源的修改等),而不关心它到底调用了依赖的哪个方法,那么即使替换成
Method B,只要Stub能提供让SUT正常执行的必要响应,测试依然能通过——这种情况下Stub就是安全且有用的工具。
总结来说:
- Stub的作用是隔离依赖,让SUT能在可控环境下执行,本身不会导致测试脆弱。
- 脆弱的根源是测试设计错误:把验证内部调用细节当成了测试目标,而非验证SUT的行为正确性。
内容的提问来源于stack exchange,提问作者ihsan
相关产品推荐
相关产品推荐

