是否java.util
Optional.ofNullable
工作正常使用的Mockito?
在代码执行期间,我遇到这样的事情:
User user = Optional.ofNullable(userProviderMock.findUser()).orElse(someMethod())
我设置我的模拟行为如下:
when(userProviderMock.findUser()).thenReturn(new User());
当我运行它时,userProviderMock
返回new User()
(调试确认),但不知何故someMethod()
仍然执行.我真的不知道为什么会这样.有线索吗?
Mockito ofNullable
并不是真正的问题.考虑以下代码:
Optional.of("foo").orElse(someMethod())
上面的代码将评估为Optional.of("foo")
- 但它仍然调用 orElse
,所以它仍然必须调用someMethod()
以将其返回值作为参数传递给orElse
,即使该参数最终没有被使用.
如果这对你来说是一个问题 - 如果你不想someMethod()
被调用,除非实际需要它的返回值 - 那么你应该使用orElseGet
:
Optional.of("foo").orElseGet(() -> someMethod())
更确切地说:
User user = Optional.ofNullable(userProviderMock.findUser()).orElseGet(() -> someMethod())
编辑添加: Didier L指出() -> someMethod()
也可以写成this::someMethod
(即:我们可以将其编写为方法参考而不是lambda),这可能更具可读性.
无论哪种方式,它都会隐式转换为大约这样:
User user = Optional.ofNullable(userProviderMock.findUser()).orElseGet(new Supplier() { public User get() { return someMethod(); } });