编写Java 8流的单元测试

时间:2018-12-17 09:42:23

标签: java junit java-8 mockito

我有一个列表,我正在流式传输此列表以获取一些过滤数据,如下所示:

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()解决此错误?

1 个答案:

答案 0 :(得分:5)

您只能模拟单个方法调用,不能模拟整个流畅的接口级联。

例如,您可以

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

以此类推。

IMO这真的不值得模拟整个过程,只需验证是否调用了所有过滤器并检查结果列表的内容即可。