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

Python mockito单元测试如何验证实例化对象的属性值

验证被mock方法所属实例属性的实现方案

使用mockito的capture能力即可捕获调用方法的实例本身,核心依据是Python实例方法的调用本质:dog.bark(5) 等价于 Dog.bark(dog, 5),当你对类打桩实例方法时,实例自身会作为第一个隐式参数传入,直接捕获这个参数就能拿到实例对象,后续即可断言其属性。


实现步骤

  • 从mockito导入capture工具
  • 声明capture类型的变量用于存储捕获到的实例
  • 调用verify时,将capture变量放在参数列表的第一位(对应隐式的self参数),后续位置放原本要校验的方法显式入参
  • 校验完成后,通过捕获变量.value拿到目标实例,直接断言其字段值即可

修改后的可运行测试代码

import unittest
from mockito import verify, when, capture

class TestFlowManager(unittest.TestCase):

    def test_foo_happy_flow(self):
        # Arrange
        when(Dog).bark(...).thenReturn(None)

        # Act
        num_of_barks = 5
        dog_type = "bulldog"
        dog_age = 3
        FlowManager(num_of_barks, dog_type, dog_age).foo()

        # Assert
        captured_dog = capture()
        # 参数顺序:第一个是隐式传入的Dog实例(self),第二个是显式传入的bark次数
        verify(Dog).bark(captured_dog, num_of_barks)

        # 断言实例属性符合预期
        assert captured_dog.value.type == dog_type
        assert captured_dog.value.age == dog_age

可选的实时校验方案

如果需要在方法被调用的当下就完成实例校验,不需要等到verify阶段,可以在打桩时使用thenAnswer传入校验逻辑,方法被调用时会自动执行校验:

def validate_bark_call(dog_instance, times):
    assert dog_instance.type == "bulldog"
    assert dog_instance.age == 3
    assert times == 5

when(Dog).bark(...).thenAnswer(validate_bark_call)

注意参数顺序坑:只有直接对类打桩实例方法时,参数列表第一个才是实例本身;如果是对单独mock出来的实例对象打桩,参数列表不需要额外加这个self参数,直接传方法的显式入参即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 04:18:18