Mockito模拟返回Optional的方法为何返回Optional.empty?无对应代码路径
问题原因解析
这是因为你用Mockito创建的mock对象完全替代了原类A的实现,原类call方法里的逻辑根本不会被执行。
Mockito对mock对象未设置存根(stub)的方法调用,会返回对应类型的默认值:
- 对于普通引用类型,默认返回
null - 对于
Optional这类容器类型,Mockito专门设置了默认返回Optional.empty()
你只给a.call(1)和a.call(2)配置了返回值,当调用a.call(3)时,因为没有对应的存根规则,Mockito就返回了Optional类型的默认值Optional.empty()。
如果想让未配置的调用也走原类逻辑,你应该用spy对象而非mock对象,修改方式如下:
// 用spy替代mock,保留原类逻辑 final var a = Mockito.spy(new A()); Mockito.when(a.call(1)).thenReturn(Optional.of(1L)); Mockito.when(a.call(2)).thenReturn(Optional.of(2L)); var test1 = a.call(1); // Optional[1] var test2 = a.call(2); // Optional[2] var test3 = a.call(3); // Optional[6],走原类逻辑
内容的提问来源于stack exchange,提问作者Ian
相关产品推荐
相关产品推荐

