#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));