带有Mockito的Java Optional.ofNullable

时间:2015-12-06 22:54:01

标签: java java-8 mockito optional

using System; using System.IO; using System.Text; namespace ResourceTest { class Program { static void Main(string[] args) { //Create a memory stream to read the file into.. MemoryStream outStream = new MemoryStream(); //Copy our _out.wav File SomeResource._out.CopyTo(outStream); //Also possible: //SomeResource.ResourceManager.GetStream("out.wav")... //Read into a byte array. byte[] file_bytes = outStream.ToArray(); //Close it outStream.Close(); //Do something with file_bytes.. } } } java.util与Mockito合作吗?

在代码执行期间,遇到类似这样的事情:

Optional.ofNullable

我将我的模拟行为设置如下:

User user = Optional.ofNullable(userProviderMock.findUser()).orElse(someMethod())

当我运行它时,when(userProviderMock.findUser()).thenReturn(new User()); 返回userProviderMock(调试确认),但不知怎的new User()仍在执行。 我真的不知道为什么会这样。有线索吗?

1 个答案:

答案 0 :(得分:5)

Mockito和ofNullable在这里并不是真正的问题。请考虑以下代码:

Optional.of("foo").orElse(someMethod())

以上代码将评估为Optional.of("foo") - 但仍然调用 orElse,因此仍需要调用someMethod()才能通过其返回 - value作为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();
    }
});