Python mock与单元测试隔离

unittest.mock替换真实依赖。Mock/MagicMock对象。patch装饰器/上下文。side_effect异常/多返回值。return_value预设返回。call_count检查调用次数。assert_called_with断言参数。spec限定接口。autospec自动匹配签名。

from unittest.mock import Mock, patch, MagicMock

class ExternalAPI:
def fetch(self):
return "real data"

class Processor:
def __init__(self, api):
self.api = api

def process(self):
data = self.api.fetch()
return data.upper()

def test_processor():
mock_api = Mock()
mock_api.fetch.return_value = "mock data"
processor = Processor(mock_api)

result = processor.process()

assert result == "MOCK DATA"
mock_api.fetch.assert_called_once()

# patch装饰器
@patch('module.ExternalAPI.fetch')
def test_patch(mock_fetch):
mock_fetch.return_value = "patched"
api = ExternalAPI()
assert api.fetch() == "patched"

# side_effect
mock = Mock()
mock.side_effect = [1, 2, ValueError("error")]
print(mock()) # 1
print(mock()) # 2
mock() # 抛出ValueError