【问题标题】:Mockito bug when testing Optional.map()? [closed]测试 Optional.map() 时的 Mockito 错误? [关闭]
【发布时间】:2021-11-07 09:08:38
【问题描述】:

这是我的实现:

List<Calendar> fetch(String input) {
    return Optional.ofNullable(input)
            .map(client::getCalendars)
            .orElse(repository.fetch());
}

还有测试:

@Test
void fetchGetsDataFromHolidayClient() {
    //Given
    String input = "search by post code or city";
    List<Calendar> expected = singletonList(mock(Calendar.class));
    doReturn(expected).when(client).getCalendars(input);
    // When
    List<Calendar> actual = service.fetch(input);
    // Then
    verify(client).getCalendars(input);
    verify(repository, never()).fetch();
    assertThat(expected).isEqualTo(actual);
}

测试失败,结果如下:

从不想要这里: -> 在 ServiceTest.fetchGetsDataFromHolidayClient(ServiceTest.java:57) 但在这里调用: -> 在 Service.fetch(Service.java:39)

日历是我的 POJO,它不是 java.util.Calendar! 我使用了 Oracle JK 8、Junit5。 这是 mockito 的 bug 吗?

【问题讨论】:

  • 对于初学者来说,像Calendar 这样的模拟值是没有意义的;只用一个真实的。此外,您似乎不是在测试fetch,而是在测试fetch2
  • @chrylis-cautiouslyoptimistic-,首先感谢您的评论。日历是我的对象,它不是来自 java.util。然后,fetch 2 是我的拼写错误。

标签: java unit-testing mockito junit5 optional-chaining


【解决方案1】:

这不是错误,而是orElse 在可选项具有非空值时进行评估。

您需要orElseGet。因此,只有在需要时才会调用存储库。 -

List<Calendar> fetch(String input) {
return Optional.ofNullable(input)
        .map(client::getCalendars)
        .orElseGet(() -> repository.fetch());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-03
    • 1970-01-01
    • 2021-05-05
    • 2022-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多