unittest.mock:在依赖边界验证调用行为
测试业务分支时,真的发送邮件或请求远程服务既慢又不稳定。把外部依赖作为参数传入,可以在测试中替换为记录调用的对象。
问题从哪里出现
测试业务分支时,真的发送邮件或请求远程服务既慢又不稳定。把外部依赖作为参数传入,可以在测试中替换为记录调用的对象。
理解核心机制
Mock 可以设置返回值、模拟异常并断言调用参数。依赖注入让替换位置明确;如果使用 patch,应替换被测模块实际查找该名字的位置。
动手做一个小实验
Python 3.11 或更新版本,仅使用标准库;将示例保存为 demo.py 后执行 python3 demo.py。
from unittest.mock import Mock
def notify_if_low(stock, send):
if stock < 3:
send("stock_low", count=stock)
send = Mock()
notify_if_low(8, send)
send.assert_not_called()
notify_if_low(2, send)
send.assert_called_once_with("stock_low", count=2)
print("notification boundary checked")适用边界与常见误区
Mock 验证的是你声明的交互,不证明真实服务与假设一致。仍需要少量集成测试检查协议、序列化和错误处理,避免模拟对象掩盖接口变化。
继续练习
让 send 抛出异常,明确调用方应该传播、重试还是记录失败;只验证实际业务要求,不把内部实现细节全部固定在测试里。