Как я могу заставить Hamcrest утверждать? Он должен спросить, имеет ли список элементов свойство, которое находится в другом списке?

#java #arrays #junit #hamcrest

#java #массивы #junit #hamcrest

Вопрос:

Хорошо, у меня есть база данных, которая заполняется случайными объектами типа MandantEntity. У меня есть finder, который находит элементы по заданному массиву идентификаторов. Я хотел бы проверить, содержит ли возвращаемый список все элементы (идентификаторы), которые я запрашиваю (массив идентификаторов), поэтому я подумал сделать это следующим образом:

 @Test
public void testFindById() {
    long[] ids = new long[10];
    for (int j = 0; j < ids.length; j  ) {
        long l = ids[j];
        MandantEntity mandantEntity = getMandant(j);
        MandantEntity save = mandantRepository.save(mandantEntity);
        ids[j] = save.getId();
    }


    final List<MandantEntity> entities = mandantRepository.findById(ids);

    assertTrue(entities.size() == ids.length);
    assertThat(entities, contains(hasProperty("id", contains(ids))));

}
 

но не работает…

java.lang.Ошибка утверждения: Ожидается: итерируемый, содержащий [hasProperty(«id», итерируемый, содержащий [[<1L>, <2L>, <3L>, <4L>, <5L>, <6L>, <7L>, <8L>, <9L>, <10L>]])]но: элемент 0: идентификатор свойства был <1L>

Я понятия не имею, как это организовать. У кого-нибудь есть идея?

Привет, Йенс

Ответ №1:

Один из способов сделать это — передать List Matcher s в contains :

 List<Matcher<Object>> expected = Arrays.stream(ids)
    .mapToObj(id -> hasProperty("id", equalTo(id)))
    .collect(Collectors.toList());

assertThat(entities, contains(expected));
 

Если вы планируете делать это часто, вы можете поместить его во вспомогательный метод:

 private static <E> Matcher<Iterable<? extends E>> containsWithProperty(String propertyName, List<?> propertyValues) {
    List<Matcher<? super E>> itemMatchers = propertyValues.stream()
        .map(value -> hasProperty(propertyName, equalTo(value)))
        .collect(Collectors.toList());

    return contains(itemMatchers);
}
 

Использование:

 // Convert ids array to a List
List<Long> idList = Arrays.stream(ids)
    .boxed()
    .collect(Collectors.toList());

assertThat(entities, containsWithProperty("id", idList));