JUnit - сравнить неизвестную коллекцию и ArrayList - PullRequest
0 голосов
/ 23 октября 2018

Я хочу сравнить Collection (продукты) (в моем случае это LinkedHashMap$LinkedValues) и ArrayList.

Тест

assertThat(products, equalTo(Lists.newArrayList(product1, product2, product3)));

не работает, потому чтоLinkedValues ​​не реализует метод equals.Поэтому я изменил свой тест на:

  assertThat(new ArrayList<>(products), equalTo(Lists.newArrayList(product1, product2, product3)));

Есть ли лучшее решение, в котором мне не нужно проверять, реализует ли коллекция метод equals?

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Вы можете использовать Arrays.equals:

assertTrue(Arrays.equals(products.toArray(), new Product[] {product1, product2, product3}));

Это проверяет размеры массивов и упорядоченность элементов.Ваш класс продукта должен реализовывать equals(), чтобы быть чем-то значимым.

Обратите внимание, что вы можете использовать ArrayList.toArray(), чтобы получить массив, если это необходимо.

0 голосов
/ 24 октября 2018

Поскольку вы используете Hamcrest, вы должны использовать слегка озадачивающий метод Matchers.contains().Он проверяет, содержит ли целевая коллекция те же элементы в том же порядке, что и исходная коллекция.

Дано

Map<String, String> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put("a", "A");
linkedHashMap.put("b", "B");

Это пройдет:

assertThat(linkedHashMap.values(), contains("A", "B"));

, и этопотерпит неудачу:

assertThat(linkedHashMap.values(), contains("B", "A"));

Обратите внимание, что Hamcrest давно умер, и хотя он хорошо работает и подходит для 99% случаев, вы будете шокированы тем, насколько хорошо AssertJ сколько функциональности он предоставляет и насколько простым может быть утверждение.

С AssertJ:

assertThat(linkedHashMap.values()).containsExactly("A", "B");
0 голосов
/ 23 октября 2018

Если тип данных, который вы используете, уже имеет метод equals, тогда нет необходимости проверять (не) реализованную функцию equals().В противном случае вам придется создать нечто, сравнивающее данные, которые вы используете.

Кстати, две строки кода у вас идентичны.Вы хотели поместить что-то еще во вторую строку?

...