编写Java 8流的单元测试

cod*_*bot 1 java junit mockito java-8

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

List<Future<Accommodation>> submittedRequestList = 
    list.stream().filter(Objects::nonNull)
                 .map(config -> taskExecutorService.submit(() -> requestHandler
                 .handle(jobId, config))).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

在编写测试时,我尝试使用来返回一些数据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);
Run Code Online (Sandbox Code Playgroud)

org.mockito.exceptions.misusing.WrongTypeOfReturnValue: LinkedList$$EnhancerByMockitoWithCGLIB$$716dd84d cannot be returned by submit()出错了。如何使用正确的方法解决此错误when()

dan*_*niu 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);
Run Code Online (Sandbox Code Playgroud)

等等。

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