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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 21:23:29