【问题标题】:Mocking java8 stream.map模拟 java8 stream.map
【发布时间】:2016-05-19 22:23:21
【问题描述】:

我正在使用 mockito 如何模拟 stream.map() 调用。

我尝试了类似这样的方法,它返回 null。

@Mock Stream<String> stringStream;
@Mock Stream<String> upperCaseStream;

when(stringStream.map(String::toUpperCase)).thenReturn(upperCaseStream);
syso(stringStream.map(String::toUpperCase));

这将打印 null。

我正在寻找一种正确的模拟方法,它会在输出中返回“大写流”。

【问题讨论】:

  • 你真的初始化upperCaseStream了吗?
  • 我已经初始化了没有问题的模拟。如果没有初始化 stringStream.map(String::toUpperCase) 会抛出 NPE。
  • 这些是经过大量测试的简单库函数。你为什么要嘲笑他们?
  • 你到底想在这里做什么?这听起来像XY question
  • 不要。只是不要嘲笑这些事情。他们不应该被嘲笑。使用真实值,如果是小玩具的话。但首先你不应该嘲笑这种事情。

标签: java unit-testing mocking java-8 mockito


【解决方案1】:

请记住,即使调用看起来相同,也不能保证方法引用或 lambda 的标识相同。 Check this out

我对 Mockito 了解不多,但我相信它会检查是否存在 when 注册的值,这可能会涉及到无法保证在这里工作的 equals 调用。例如:

Function<String, String> fn1 = String::toUpperCase;
Function<String, String> fn2 = String::toUpperCase;
System.out.println(fn1.equals(fn2)); // false on my machine

您可以简单地将引用存储在一个变量中并在以后使用它

Function<String, String> toUpperCase = String::toUpperCase;
when(stringStream.map(toUpperCase)).thenReturn(upperCaseStream);

System.out.println(stringStream.map(toUpperCase));

顺便说一句,我真的不明白为什么需要模拟 Stream&lt;String&gt; 在那里你可以简单地做 Stream.of("foo","bar")

【讨论】:

  • “即使调用看起来相同,也不保证方法引用或 lambda 的标识相同”。这解释了为什么我的方法失败了。谢谢。
猜你喜欢
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-07
  • 1970-01-01
  • 2020-10-02
相关资源
最近更新 更多