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

Mockito传参问题:Mockito.eq(1L)传入方法变为0L的排查与解决

问题原因与解决方案:Mockito.eq(1L)传参却得到0L

问题原因

出现这个问题的核心是违反了Mockito参数匹配器的使用规则:当你在when()或verify()调用中使用任意一个参数匹配器(比如eq(1L)),所有参数都必须通过匹配器传递。如果混合使用匹配器和原始值(比如直接传new Business()),Mockito会将非匹配器的参数替换为对应类型的默认值——long类型的默认值就是0L,这就导致你传入的eq(1L)被无效化,实际进入方法的参数变成了0L。

典型错误写法示例:

// 错误:混合使用匹配器和原始对象参数
when(businessService.updateBusiness(eq(1L), new Business())).thenReturn(updatedBusiness);

正确传递1L参数的方法

方法1:所有参数都使用匹配器

如果不需要严格匹配第二个参数,用any()系列匹配器替代原始值:

// 正确:所有参数均使用匹配器
when(businessService.updateBusiness(eq(1L), any(Business.class))).thenReturn(updatedBusiness);

方法2:对所有参数显式使用eq()匹配器

如果需要匹配特定的Business对象,把原始对象也用eq()包裹:

Business expectedBusiness = new Business();
// 正确:所有参数都通过eq()传递
when(businessService.updateBusiness(eq(1L), eq(expectedBusiness))).thenReturn(updatedBusiness);

方法3:不使用匹配器,直接传递原始值

如果参数都是确定的固定值,也可以完全不用匹配器,直接传值:

// 正确:无匹配器,直接传原始值
when(businessService.updateBusiness(1L, expectedBusiness)).thenReturn(updatedBusiness);

注意:verify()方法的参数规则和when()完全一致,如果你在验证方法调用时也犯了同样的混合使用错误,同样会出现参数被替换为0L的问题,需要按照上述规则修正。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 06:23:27