У меня есть список, и я транслирую этот список, чтобы получить отфильтрованные данные как:
List<Future<Accommodation>> submittedRequestList =
list.stream().filter(Objects::nonNull)
.map(config -> taskExecutorService.submit(() -> requestHandler
.handle(jobId, config))).collect(Collectors.toList());
Когда я писал тесты, я пытался вернуть некоторые данные с помощью when()
:
List<Future<Accommodation>> submittedRequestList = mock(LinkedList.class);
when(list.stream().filter(Objects::nonNull)
.map(config -> executorService.submit(() -> requestHandler
.handle(JOB_ID, config))).collect(Collectors.toList())).thenReturn(submittedRequestList);
Я получаю ошибку org.mockito.exceptions.misusing.WrongTypeOfReturnValue:
LinkedList$$EnhancerByMockitoWithCGLIB$$716dd84d cannot be returned by submit()
. Как я могу исправить эту ошибку, используя правильный when()
?
Кроме того, почему вы издеваетесь над LinkedList
? Просто используйте реальную реализацию. new LinkedList<>()
. Бум, готово. Ведет себя совершенно правильно.
Вы можете имитировать только вызовы отдельных методов, а не целые каскады свободного интерфейса.
Например, вы могли бы сделать
Stream<Future> fs = mock(Stream.class);
when(requestList.stream()).thenReturn(fs);
Stream<Future> filtered = mock(Stream.class);
when(fs.filter(Objects::nonNull).thenReturn(filtered);
и так далее.
ИМО, действительно не стоит издеваться над всем этим, просто убедитесь, что все фильтры были вызваны, и проверьте содержимое списка результатов.
На самом деле нет смысла издеваться над потоками. Есть правило, что вы не должны высмеивать то, что вам не принадлежит. Реализация может быть изменена через некоторое время, и тест не удастся, потому что вы тестируете не поведение, а особенности. Представьте, как вы напишете этот тест, если вы хотите сначала написать тест? Вы предположите, что ДОЛЖНЫ использовать там поток?