Подтвердить что ты не робот

Что такое идиоматический шаблон Хамкреста, утверждающий, что каждый элемент итерабельного соответствует данному совпадению?

Изучите следующий фрагмент:

    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"
4b9b3361

Ответ 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"));

Вот почему.