gpt4 book ai didi

Java Optional.ofNullable 与 Mockito

转载 作者:行者123 更新时间:2023-11-29 07:37:15 25 4
gpt4 key购买 nike

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<User>() {
public User get() {
return someMethod();
}
});

关于Java Optional.ofNullable 与 Mockito,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34123868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com