测试 Optional.map() 时的 Mockito 错误?
Mockito bug when testing Optional.map()?
这是我的实现:
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 的错误吗?
这不是一个错误,而是 orElse
在可选项具有非空值时被评估。
你需要orElseGet
。因此,只有在需要时才会调用存储库。 -
List<Calendar> fetch(String input) {
return Optional.ofNullable(input)
.map(client::getCalendars)
.orElseGet(() -> repository.fetch());
}
这是我的实现:
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 的错误吗?
这不是一个错误,而是 orElse
在可选项具有非空值时被评估。
你需要orElseGet
。因此,只有在需要时才会调用存储库。 -
List<Calendar> fetch(String input) {
return Optional.ofNullable(input)
.map(client::getCalendars)
.orElseGet(() -> repository.fetch());
}