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

