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
相关产品推荐
相关产品推荐

