You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用类型提示自动完全Mock带方法的Python类?

自动生成符合类型契约的Stub/Mock类需求

开发背景

我正在开发一个通过对应SDK与Gmail、Discord等外部服务交互的程序,核心问题是程序会发起大量网络调用、执行高开销计算,需要用Stub对象规避这些操作。目前使用的SDK通过带类型提示的标准Python类暴露功能,手动编写Stub短期可行,但随着服务和方法规模增长,长期来看不现实。

需求示例

原服务类(带类型提示)

from dataclasses import dataclass

@dataclass
class EmailReceipt:
    receiver_email_address: str
    email_text: str
    # 其他字段...

class GmailService:
    # 其他方法...
    def send_email(self, receiver_email: str) -> EmailReceipt:
        """此处会发起真实网络调用发送邮件"""
        pass

手动实现的Stub类

class GmailServiceStub:
    # 其他Stub方法...
    def send_email(self, receiver_email: str) -> EmailReceipt:
        """生成随机的EmailReceipt实例返回,避免真实网络请求"""
        return EmailReceipt(
            receiver_email_address=receiver_email,
            email_text="Mocked email content"
        )

开发中通过依赖注入可以轻松切换GmailService和GmailServiceStub,用Mock版本加速开发、用于测试。Stub只需满足方法的返回类型契约(比如send_email返回EmailReceipt实例),无需关注业务逻辑,保证下游代码能正常运行。当前仅2个服务共10个方法,但规模正在增长,希望有工具/库能自动生成这类Mock类。

理想工具接口

期望能通过简单调用自动生成符合类型的Mock服务:

mocked_service = mocker.mock_class(GmailService)
# mocked_service的所有方法自动返回符合对应类型/对象,供下游代码正常使用

可行方案

Python生态工具

  1. unittest.mock.create_autospec
    Python标准库自带的工具,能基于原类创建保留类型提示的Mock对象,严格遵循原类的方法签名:
from unittest.mock import create_autospec

# 创建严格遵循GmailService类型的Mock
mocked_service = create_autospec(GmailService, spec_set=True)
# 若需要返回真实的EmailReceipt实例,可结合工厂类生成
from factory import Factory

class EmailReceiptFactory(Factory):
    class Meta:
        model = EmailReceipt
    receiver_email_address = "test@example.com"
    email_text = "Mocked auto-generated content"

# 配置方法返回自动生成的实例
mocked_service.send_email.return_value = EmailReceiptFactory()
  1. pytest-mock + factory_boy
    如果用pytest做测试,pytest-mock简化了unittest.mock的使用,配合factory_boy可以批量生成符合类型的返回实例,适合大规模服务的Mock场景。

  2. hypothesis
    可以自动生成符合类型约束的随机测试数据,适合需要生成多样化Mock返回值的场景,能确保返回的实例完全符合类型契约。

其他编程语言支持

  • Java:Mockito、EasyMock可以快速生成Mock类,结合自定义Answer能自动返回符合类型的实例;Spring生态中配合Lombok的@Mock注解可更便捷地生成。
  • TypeScript/JavaScript:Jest的jest.mock()支持自动生成Mock,ts-mockito则提供强类型Mock能力,严格遵循TypeScript类型定义自动返回对应类型的对象。
  • C#:Moq库支持创建强类型Mock对象,方法默认返回对应类型的默认值,也可灵活配置返回自定义实例,完全适配.NET的类型系统。

内容的提问来源于stack exchange,提问作者Hashir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 03:20:27