Mockito报错:期望调用未执行但存在其他交互问题排查
兄弟,我之前也踩过一模一样的坑!你已经确认用的是Mock对象,但还是报这个错,那大概率是参数不匹配或者方法重载导致的调用混淆,咱们一步步来拆解排查:
先盯紧方法名和参数细节:你期望的是
dsIn.setItemString(1, "MAKE", "MAKE"),但实际交互里出现了dsIn.setItemObject(1, "MAKE", null)——注意到没?一个是setItemString,一个是setItemObject,而且第三个参数一个是字符串"MAKE",一个是null。会不会是你的业务代码里,当某个条件触发时(比如值为null、类型不匹配),自动调用了重载的setItemObject方法,而非你期望的setItemString?用Mockito验证工具实锤实际调用:你可以在测试代码里加一行验证,确认这个意外的方法调用确实存在:
Mockito.verify(dsIn, Mockito.times(1)).setItemObject(1, "MAKE", null);验证通过后,回头去查业务代码:为什么会走到
setItemObject的分支?是不是某个前置逻辑把"MAKE"这个值改成null了?或者有个判断逻辑,当值为null时调用setItemObject?检查Mock对象的行为设置冲突:有没有在测试里给
setItemString设置了返回值,但业务代码根本没触发对应的条件?比如你写了when(dsIn.setItemString(1, "MAKE", "MAKE")).thenReturn(true);,但实际代码里因为某个变量的状态,根本没走到这个方法调用的分支?另外,有没有不小心调用了reset(dsIn)重置Mock对象,导致之前的交互记录被清空?警惕参数类型的隐性差异:有没有可能第二个参数是枚举类型,而不是字符串?比如业务代码里传的是
MAKE枚举,而你测试里期望的是字符串"MAKE",这时候Mockito会认为参数不匹配,导致期望的调用没被命中。这种情况可以用匹配器来精准验证:// 严格匹配参数类型和值 Mockito.verify(dsIn).setItemString(eq(1), eq("MAKE"), eq("MAKE")); // 宽松匹配第三个参数(如果允许值有变化) Mockito.verify(dsIn).setItemString(eq(1), eq("MAKE"), anyString());
核心总结:这个报错的本质就是你期望的方法调用(含参数)和实际发生的调用完全不匹配,别被"其他交互存在"这句话带偏,重点对比方法名、参数的类型和值,尤其是重载方法的细节,往往问题就藏在这里!
内容的提问来源于stack exchange,提问作者TacoB0t

