Макет метода, который возвращает поток и вызывается более одного раза - PullRequest
0 голосов
/ 11 февраля 2019
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: поток уже был обработан или закрыт

Ответы [ 3 ]

0 голосов
/ 11 февраля 2019

Попробуйте это:

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

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

s.forEach(System.out::println);
0 голосов
/ 11 февраля 2019

Вы не издеваетесь над потоком, вы создаете один - и только один, который будет использоваться после вызова первого завершающего метода, который вы испытываете.

БольшинствоВ этом случае лучше придерживаться насмешек, насколько это возможно, в вашем случае

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 звонка.

0 голосов
/ 11 февраля 2019

Попробуйте 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.

...