Что такое идиоматический шаблон Хамкреста, утверждающий, что каждый элемент итерабельного соответствует данному совпадению?
Изучите следующий фрагмент:
assertThat(
Arrays.asList("1x", "2x", "3x", "4z"),
not(hasItem(not(endsWith("x"))))
);
Это утверждает, что в списке нет элемента, который не заканчивается на "x" . Разумеется, это двойной негативный способ сказать, что все элементы списка заканчиваются на "x" .
Также обратите внимание, что сниппет бросает:
java.lang.AssertionError:
Expected: not a collection containing not a string ending with "x"
got: <[1x, 2x, 3x, 4z]>
Здесь перечисляется весь список, а не только элемент, который не заканчивается символом "x" .
Итак, есть ли идиоматический способ:
- Утверждение, что каждый элемент заканчивается на "x" (без двойных негативов)
- При ошибке утверждения укажите только те элементы, которые не заканчиваются на "x"
Ответы
Ответ 1
Матчи, предоставленные Дэвидом Харкнессом, дают хорошее сообщение для ожидаемой части.
Однако сообщение для фактической части также определяется с помощью метода assertThat
, который вы используете:
Один из JUnit (org.junit.Assert.assertThat
) создает предоставленный вами вывод.
-
С помощью not(hasItem(not(...)))
:
java.lang.AssertionError:
Expected: not a collection containing not a string ending with "x"
got: <[1x, 2x, 3x, 4z]>
-
С помощью everyItem(...)
:
java.lang.AssertionError:
Expected: every item is a string ending with "x"
got: <[1x, 2x, 3x, 4z]>
Один из Hamcrest (org.hamcrest.MatcherAssert.assertThat
) выводит результат, заданный Дэвидом:
-
С помощью not(hasItem(not(...)))
:
java.lang.AssertionError:
Expected: not a collection containing not a string ending with "x"
but: was <[1x, 2x, 3x, 4z]>
-
С помощью everyItem(...)
:
java.lang.AssertionError:
Expected: every item is a string ending with "x"
but: an item was "4z"
Мои собственные эксперименты с утверждением Hamcrest показали мне, что "но" часть часто путается, в зависимости от того, как сочетаются несколько совпадений, а кто неудачно, и поэтому я все еще придерживаюсь утверждения JUnit, где я знаю довольно именно то, что я увижу в "полученной" части.
Ответ 2
Вы ищете everyItem()
:
assertThat(
Arrays.asList("1x", "2x", "3x", "4z"),
everyItem(endsWith("x"))
);
Это создает приятное сообщение об ошибке:
Expected: every item is a string ending with "x"
but: an item was "4z"
Ответ 3
Я знаю, что этот вопрос довольно старый, но сегодня, с Java 8, я лучше напишу его с помощью lambdas, например.
Stream.of("1x", "2x", "3x", "4z").allMatch(e->e.endsWith("x"));
Вот почему.