Stream 已经在 Mockito 中被操作或关闭了吗?

Jav*_*per 2 unit-testing exception mockito java-8 java-stream

我想测试一种返回流的方法。

class Foo {
    public void getClicks(boolean somecondition) {
        Stream s1 = computeAndGetAllClicks(new Date());
        if (somecondition) {
            Stream s2 = computeAndGetAllClicks(new Date());
        }
        return Stream.concat(s1, s2);
    }

    Stream computeAndGetAllClicks(Date d) {
        // return stream
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我已经为 somecondition = true 的情况编写了以下测试

    final ArgumentCaptor<Date> argumentCaptorTodayDate = ArgumentCaptor.forClass(Date.class);

    doReturn(Arrays.asList(new Click.Builder().build()).stream())
    .when(fooInstance)
    .addAtlasLineItem(computeAndGetAllClicks(argumentCaptorTodayDate.capture))

   final ArgumentCaptor<Date> argumentCaptorEndDate = ArgumentCaptor.forClass(Date.class);


    doReturn(Arrays.asList(new Click.Builder().build()).stream())
    .when(fooInstance)
    .addAtlasLineItem(computeAndGetAllClicks(argumentCaptorEndDate.capture))

    fooInstance.getClicks(true);
Run Code Online (Sandbox Code Playgroud)

但是我得到异常: java.lang.IllegalStateException:流已被操作或关闭。

我该如何解决它?

use*_*449 7

您可以使用 thenAnswer 并在每次调用时创建新流:

doAnswer(invocationOnMock->Arrays.asList(new Click.Builder().build()).stream())
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的解决方案。为什么它不被接受? (2认同)