使用Mockito测试时出现WrongTypeOfReturnValue错误求助
解决Mockito的WrongTypeOfReturnValue错误
可能的原因及修复方案
1. 返回类型不匹配
检查util.esutil.search()方法的实际返回类型,必须和thenReturn传入的List<BeGeo>严格一致。如果该方法实际返回的是其他类型(比如List<Map<String, Object>>),直接触发此错误。
- 修复:核对方法签名,保证返回值类型完全匹配。
2. 泛型擦除引发的匹配问题
Java泛型在运行时会被擦除,Mockito可能无法精准识别泛型类型。可以用ArgumentMatchers模糊匹配参数,绕过泛型擦除的影响:
// 用参数匹配器替代具体实例,避免泛型识别错误 Mockito.when(util.esutil.search(ArgumentMatchers.eq(Begeo.class), ArgumentMatchers.eq(Begeo_index), ArgumentMatchers.eq(Begeo_index), ArgumentMatchers.anyList())) .thenReturn(list);
3. 无法mock非接口/非抽象类的方法
如果EsUtil(util.esutil的实际类型)是普通类,且search方法是final的,或者类本身是final的,Mockito默认无法正确mock这类方法,也会触发错误。
- 修复:若为final类,改用
Mockito.mock(EsUtil.class, Mockito.CALLS_REAL_METHODS),或使用PowerMockito扩展;若为final方法,建议将类重构为接口,或用PowerMockito处理。
4. 参数匹配不一致
mock时使用的参数实例,和测试代码中实际调用的参数实例不一致,Mockito会判定为不同的调用,导致返回值不匹配。
- 修复:用
ArgumentMatchers的匹配方法(如any()、eq())替代具体参数实例,或确保mock和调用时使用同一个参数对象。
额外检查点
- 确认
list确实是List<BeGeo>类型,无隐式类型转换错误。 - 若
search是静态方法,普通Mockito无法处理,需使用Mockito 3.4+的Mockito.mockStatic(),或PowerMockito。
内容的提问来源于stack exchange,提问作者papun
相关产品推荐
相关产品推荐

