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

