如何用Mockito验证被Mock方法的调用参数满足自定义条件
Python Mockito 验证方法调用参数的自定义条件
给定待测试的类:
class A: def __init__(self, a): self.a = a def foo(self, a): self.a = 2 * a return 2 * a
要验证foo方法被调用一次,且传入的参数a能被2整除,你提到的两种思路可以这样实现:
思路1:用自定义断言匹配参数(对应lambda替代具体参数)
Python Mockito提供了arg_that匹配器,支持传入自定义校验逻辑(比如lambda函数)来验证参数是否符合要求:
from mockito import expect, arg_that instance = A(1) # 用arg_that传入lambda校验参数是否能被2整除 expect(instance, times=1).foo(a=arg_that(lambda x: x % 2 == 0)).thenReturn(10) # 测试调用(符合条件,验证通过) instance.foo(4) # 如果调用instance.foo(5),会触发验证失败,因为参数不满足条件
arg_that会自动将传入的参数代入lambda函数,返回True则匹配成功,否则验证失败,完全对应Java Mockito中用lambda做参数匹配的逻辑。
思路2:匹配任意参数后自行校验调用记录
先用...匹配任意参数完成调用次数验证,再通过Mockito的调用记录提取参数并自行校验:
方法A:用verify获取调用信息
from mockito import expect, verify, any instance = A(1) # 匹配任意参数,预期调用1次 expect(instance, times=1).foo(a=...).thenReturn(10) # 执行测试调用 instance.foo(6) # 验证调用并获取调用实例 call = verify(instance).foo(a=any) # 提取关键字参数a并校验 assert call.kwargs['a'] % 2 == 0
方法B:从mock对象直接获取调用记录
from mockito import expect instance = A(1) # 打补丁并保存mock对象引用 mocked_foo = expect(instance, times=1).foo(a=...).thenReturn(10) # 执行测试调用 instance.foo(8) # 获取所有调用记录 invocations = mocked_foo.invocations # 先验证调用次数(其实expect已经做了,但可以再次确认) assert len(invocations) == 1 # 提取参数并校验 assert invocations[0].kwargs['a'] % 2 == 0
这种方式先完成调用次数的验证,再通过调用记录手动校验参数的业务规则,灵活性更高。
内容的提问来源于stack exchange,提问作者Kins
相关产品推荐
相关产品推荐

