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

Mockito中thenReturn可用但doReturn失效问题求助

Mockito Spy使用doReturn存根报错的原因及解决

你的问题出在doReturn的语法使用错误,导致Mockito识别到未完成的存根操作,抛出UnfinishedStubbingException。

错误写法的问题所在

你当前的doReturn代码:

doReturn(Optional.of(user1)).when(userRepositoryMock.findById(anyString()));

这里的when()方法传入的是方法调用的结果(userRepositoryMock.findById(anyString())的执行结果),但Mockito的doReturn语法要求,when()里必须传入被Spy的实例对象,之后再链式调用要存根的方法。

正确的doReturn写法

修正后的代码应该是:

doReturn(Optional.of(user1)).when(userRepositoryMock).findById(anyString());

这样的结构才符合Mockito对doReturn存根的语法要求:先通过doReturn()指定返回值,再用when(spy实例)指定要存根的对象,最后调用要存根的方法并传入参数匹配器。

为什么会抛出这个异常

当你把方法调用userRepositoryMock.findById(anyString())直接传入when()时,Mockito会误以为你正在执行存根的第一步(类似when(...)的语法),但后续没有跟上thenReturn()等完成存根的操作,因此判定为“未完成的存根”,抛出对应的异常。

额外说明:when和doReturn的语法差异

  • when(spy.method(...)).thenReturn(...):会先执行一次真实的spy.method(...)方法(这是Spy和Mock的核心区别,Mock不会执行真实方法),再存根返回值。
  • doReturn(...).when(spy).method(...):不会执行真实方法,直接存根返回值,适合需要跳过真实方法执行的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 22:37:36