Написание модульных тестов для потоков Java 8

У меня есть список, и я транслирую этот список, чтобы получить отфильтрованные данные как:

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()?

На самом деле нет смысла издеваться над потоками. Есть правило, что вы не должны высмеивать то, что вам не принадлежит. Реализация может быть изменена через некоторое время, и тест не удастся, потому что вы тестируете не поведение, а особенности. Представьте, как вы напишете этот тест, если вы хотите сначала написать тест? Вы предположите, что ДОЛЖНЫ использовать там поток?

ByeBye 17.12.2018 10:54

Кроме того, почему вы издеваетесь над LinkedList? Просто используйте реальную реализацию. new LinkedList<>(). Бум, готово. Ведет себя совершенно правильно.

Andy Turner 17.12.2018 10:59
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
2 488
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете имитировать только вызовы отдельных методов, а не целые каскады свободного интерфейса.

Например, вы могли бы сделать

Stream<Future> fs = mock(Stream.class);
when(requestList.stream()).thenReturn(fs);
Stream<Future> filtered = mock(Stream.class);
when(fs.filter(Objects::nonNull).thenReturn(filtered);

и так далее.

ИМО, действительно не стоит издеваться над всем этим, просто убедитесь, что все фильтры были вызваны, и проверьте содержимое списка результатов.

Другие вопросы по теме