测试具有stream()和filter()的方法

时间:2018-06-08 16:21:46

标签: java spring testing

方法

    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()方法?

1 个答案:

答案 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%覆盖过滤器。