【问题标题】:Writing unit tests for Java 8 streams为 Java 8 流编写单元测试
【发布时间】:2018-12-17 09:42:22
【问题描述】:

我有一个列表,我正在流式传输此列表以获取一些过滤后的数据:

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&lt;&gt;()。砰,完成。行为完全正确。

标签: java junit java-8 mockito


【解决方案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);

等等。

IMO 真的不值得嘲笑整个事情,只需验证是否调用了所有过滤器并检查结果列表的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多