方法
public List<OtherTitle> getTitles(
@Min(1) final Long id
) throws ResourceNotFoundException {
log.info("Called with id {}", id);
return this.findMovie(id).getOtherTitles()
.stream()
.filter(title -> title.getStatus() == DataStatus.ACCEPTED)
.map(ServiceUtils::toOtherTitleDto)
.collect(Collectors.toList());
}
我写了一个测试
@Test
public void canGetMovieTitles() throws ResourceException {
final Long id = new Random().nextLong();
final MovieEntity entity = Mockito.mock(MovieEntity.class);
Mockito.when(entity.getOtherTitles()).thenReturn(Lists.newArrayList());
Mockito
.when(this.movieRepository.findByIdAndStatus(id, DataStatus.ACCEPTED))
.thenReturn(Optional.of(entity));
Assert.assertTrue(this.service.getTitles(id).isEmpty());
}
在Jacoco
工具的帮助下,我想检查测试的范围。事实证明,getTitles()
方法已经过100%测试,但使用此方法的lambda范围为0%https://zapodaj.net/303603912f57f.png.html。在预览https://zapodaj.net/d68d7252b1d17.png.html中,过滤器()在黄色上突出显示。
如何使用filter()
测试此stream()
方法?
答案 0 :(得分:0)
我将假设你的DataStatus实现如下:
public enum DataStatus {
ACCEPTED,
REJECTED;
}
添加另一个看起来像这样的测试
@Test
public void canGetMovieTitles() throws ResourceException {
List<OtherTitle> othertitleList = new ArrayList<>();
OtherTitle ot = new OtherTitle();
ot.setTitle(DataStatus.ACCEPTED);
othertitleList.add(ot);
ot = new OtherTitle();
ot.setTitle(DataStatus.REJECTED);
othertitleList.add(ot);
final Long id = new Random().nextLong();
final MovieEntity entity = Mockito.mock(MovieEntity.class);
Mockito.when(entity.getOtherTitles()).thenReturn(othertitleList);
Mockito.when(this.movieRepository.findByIdAndStatus(id, DataStatus.ACCEPTED)).thenReturn(Optional.of(entity));
Assert.assertEquals(1, this.service.getTitles(id).size());
}
问题是如果列表为空,过滤器将永远不需要过滤任何内容。所以我们添加了另外两个标题,一个应该被过滤器接受,另一个应该被过滤器拒绝。这应该使我们100%覆盖过滤器。