Mockito中argThat()被意外多次调用的原因解析
Mockito中argThat() Lambda执行多次的原因解析
当你用argThat()验证save()的两次调用时,Lambda被执行6次是Mockito内部匹配机制导致的正常现象,核心原因如下:
调用记录的多轮匹配校验:Mockito在验证方法调用时,会遍历所有的调用记录(这里是2次
save调用),并对每一条记录多次应用匹配器逻辑。比如它需要先确认每条记录是否符合你的匹配条件,再验证总调用次数是否符合times(2),还要排除不符合条件的调用干扰,这个多轮校验过程会重复触发argThat()的Lambda。匹配器的内部处理流程:
argThat()属于Mockito的自定义匹配器,这类匹配器在验证阶段会被Mockito多次评估——包括预检查匹配逻辑的合法性、缓存匹配结果、以及交叉验证不同调用组合的可能性。比如Mockito会尝试将第一条调用与无ID条件匹配,第二条与带ID条件匹配,同时还会反向验证(第一条是否符合带ID,第二条是否符合无ID)来确保没有误判,这些尝试都会执行你的Lambda。times(2)的次数验证逻辑:当你指定
times(2)时,Mockito不仅要找到2条符合条件的调用,还要确保不存在更多符合条件的调用。为了完成这个校验,它会多次遍历调用列表,对每个调用执行匹配逻辑、统计符合条件的数量,这个过程也会增加Lambda的执行次数。
需要注意的是,只要你的argThat() Lambda是无副作用的(比如不修改外部变量、不执行IO操作),即使执行多次也不会影响测试结果,这是Mockito保证验证准确性的正常机制。
内容的提问来源于stack exchange,提问作者BabyishTank
相关产品推荐
相关产品推荐

