首页 > 解决方案 > Stream has already been operated upon or closed in Mockito?

问题描述

I want to test a method to return a 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
    }
}

Now I have written the following test for case when 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);

However I get exception: java.lang.IllegalStateException: stream has already been operated upon or closed.

How do I get around it ??

标签: unit-testingexceptionjava-8mockitojava-stream

解决方案


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

doAnswer(invocationOnMock->Arrays.asList(new Click.Builder().build()).stream())

推荐阅读