Java Hamcrest Matcher проверить, если список содержит другой список - PullRequest
0 голосов
/ 28 октября 2019

Я хочу сравнить, если список является подсписком другого списка

Предположим, у меня есть следующие списки

List<String> checkList = Arrays.asList("a", "d");

List<String> actualList = Arrays.asList("a", "b", "c", "d");

Я хочу проверить, содержит ли actualList checkList. Я могу повторить каждое значение и сравнить. Но есть ли какие-нибудь приспособления для подколенного сухожилия, которые сделают эту работу

Например.

a, d должен пройти

a, b, c должен пройти

Но a, e должен потерпеть неудачу

hasItems поддерживает передачу строк по отдельности, contains проверяет все значения, in поддерживает элемент, присутствующий в списке. Но я хотел

assertThat(actualList,containsList(checkList))

Есть ли в наличии встроенный сопоставитель или мне нужно написать настраиваемое сопоставление?

1 Ответ

1 голос
/ 28 октября 2019

hasItems принимает параметр varargs, поэтому вы можете просто преобразовать свой список в массив и передать его (в качестве альтернативы, просто объявить его как массив для начала):

final List<String> checkList = Arrays.asList("a", "d");
// final String[] checkListAsArray = new String[] { "a", "d" };
final String[] checkListAsArray = checkList.toArray(new String[checkList.size()]);
final List<String> actualList = Arrays.asList("a", "b", "c", "d");
assertThat(actualList, Matchers.hasItems(checkListAsArray));

Порядокконтрольный список не важен.

Если вы поменяете ролями checkList и actualList, вы также можете написать:

assertThat(checkList, everyItem(isIn(actualList)));

Это, вероятно, более читабельно, чем:

assertTrue(actualList.stream().allMatch(checkList::contains));
...