Тестирование метода, который имеет stream () и filter () - PullRequest
0 голосов
/ 08 июня 2018

Для метода

    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%, но лямбда с этим методом имеет диапазон 0% https://zapodaj.net/303603912f57f.png.html.. В предварительном просмотре https://zapodaj.net/d68d7252b1d17.png.html, фильтр () выделен желтым цветом.

Как вы тестируете этот filter() метод с stream()?

1 Ответ

0 голосов
/ 08 июня 2018

Я предполагаю, что ваша реализация для 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% охват фильтра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...