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

Mockito校验方法调用正常,但接口单元测试仍失败的原因是什么?

问题根因

原测试失败不是Mockito打桩逻辑本身有问题,是打桩时的参数匹配规则和实际调用时的参数不匹配,导致打桩未生效,控制器返回null,所以jsonPath校验根节点存在失败。

具体原因拆解

  • Mockito默认的参数匹配逻辑是调用对象的equals方法进行匹配。你原测试的打桩代码Mockito.when(voteService.update(5, VOTE_CREATION_ADRIANO)).thenReturn(VOTE_RESPONSE_ADRIANO),要求第二个参数必须和你定义的常量VOTE_CREATION_ADRIANO通过equals比对相等才会触发返回逻辑。
  • 测试中你通过objectMapper.writeValueAsString(VOTE_CREATION_ADRIANO)把对象序列化为JSON传给接口,Spring MVC会把JSON反序列化为一个全新的VoteCreationDTO实例,如果你的VoteCreationDTO没有重写equals方法,默认会按对象内存地址比对,新实例和你常量里的实例地址不同,equals返回false,Mockito就不会匹配到这个打桩规则,默认返回null。
  • 你改后的测试用refEq做参数校验,refEq是通过反射比对两个对象的字段值,不依赖equals方法,所以可以匹配成功,因此verify通过。

解决方案

把原测试的打桩代码改成用refEq匹配DTO参数即可:

Mockito.when(voteService.update(eq(5), refEq(VOTE_CREATION_ADRIANO))).thenReturn(VOTE_RESPONSE_ADRIANO);

也可以给VoteCreationDTO加上@EqualsAndHashCode注解(Lombok)或者手动重写equals和hashCode方法,原打桩代码不用改也能正常生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 21:54:00