【问题标题】:Mock a method that returns a Stream and is called more than one time模拟一个返回 Stream 并被多次调用的方法
【发布时间】:2019-07-05 03:37:34
【问题描述】:
MyStreamClass mock = mock(MyStreamClass.class);

when(mock.streamMethod()).thenReturn(Stream.of("A", "B"));

System.out.println(""+mock.streamMethod().findFirst());
System.out.println(""+mock.streamMethod().findFirst());

findFirst 的第二次调用会抛出 java.lang.IllegalStateException: stream has already been operating on or closed

【问题讨论】:

  • 请不要使用""+,使用toString()

标签: java unit-testing junit mocking mockito


【解决方案1】:

尝试使用thenAnswer 而不是thenReturn

Answer<Stream> answer = new Answer<Stream>() {
    public Stream answer(InvocationOnMock invocation) throws Throwable {
        return Stream.of("A", "B");
    }
};


when(mock.streamMethod()).thenAnswer(answer);

现在将为每次调用 streamMethod 创建一个新流。

进一步阅读:

这是我在Dynamic Answering in Mockito 上写的一篇文章,可能是互补的。

【讨论】:

  • Answer 是一个函数式接口,您可以通过 lambda 函数返回它(大多数情况下它更具可读性)。
【解决方案2】:

试试这个:

MyStreamClass mock = Mockito.mock(MyStreamClass.class);

Mockito.when(mock.streamMethod()).thenReturn(Stream.of("A", "B"));
Stream s = mock.streamMethod();

s.forEach(System.out::println);

【讨论】:

    【解决方案3】:

    您不是在模拟 Stream,而是在创建一个 - 并且只有一个,它将在调用第一个终止方法后被消耗,这就是您所体验的。

    在大多数情况下,最好尽可能坚持嘲笑,就你而言

    MyStreamClass mock = mock(MyStreamClass.class);
    Stream mockStream = mock(Stream.class);
    when(mock.streamMethod()).thenReturn(mockStream);
    

    这应该足以测试MyStreamClass 的所有客户端 - 从流中获取实际结果是没有意义的。

    如果这不适合您的设计,您也可以使用Answer

    when(mock.streamMethod()).then(i -> Stream.of("A", "B"));
    

    这将导致每次调用该方法时都会创建流。

    或者,您可以使用thenReturn() 模拟多个调用。

    when(mock.streamMethod()).thenReturn(Stream.of("A", "B"), Stream.of("A", "B"));
    

    这将持续你 2 个电话。

    【讨论】:

      【解决方案4】:

      使用 Java 8 方法尝试 thenAnswer

      when(mock.streamMethod()).thenAnswer(invocation -> Stream.of("A", "B"))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-17
        • 1970-01-01
        • 2022-01-04
        • 2014-11-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多