什么是 Mock?
在单元测试中,Mock(模拟对象) 是一种用于替代真实依赖的测试替身。 它允许你在不调用外部服务(如数据库、API、文件系统等)的情况下,验证被测代码的行为是否符合预期。
使用 Mock 可以:
- 隔离测试目标,避免外部依赖干扰
- 加速测试执行速度
- 模拟异常或边界情况(如网络错误、空数据)
- 提高测试的可重复性和稳定性
常见 Mock 场景示例
JavaScript(Jest)示例:
// 模拟一个 API 调用
const mockFetchUser = jest.fn().mockResolvedValue({ id: 1, name: 'Alice' });
// 在测试中使用
test('should fetch user data', async () => {
const user = await fetchUser(1);
expect(mockFetchUser).toHaveBeenCalledWith(1);
expect(user.name).toBe('Alice');
});
Python(unittest.mock)示例:
from unittest.mock import patch
@patch('my_module.requests.get')
def test_get_user(mock_get):
mock_get.return_value.json.return_value = {'name': 'Bob'}
result = get_user(2)
assert result['name'] == 'Bob'
最佳实践建议
- 仅 Mock 外部依赖,不要 Mock 被测类自身的方法
- 避免过度 Mock,否则测试可能失去意义
- 为 Mock 设置明确的返回值或行为,确保测试意图清晰
- 定期审查 Mock 的使用,防止测试与实现过度耦合