Как бы вы кратко заявили о равенстве элементов collections
, а именно Set
в JUnit 4
?
JUnit 4 сравнить коллекции
Ответ 1
Вы можете просто утверждать, что два набора равны друг другу, что вызывает метод
Этот тест пройдет, если два набора имеют одинаковый размер и содержат одни и те же элементы.
Ответ 2
Apache снова отправляется на помощь.
assertTrue(CollectionUtils.isEqualCollection(coll1, coll2));
Работает как шарм. Я не знаю, почему, но я обнаружил, что с коллекциями следующий assertEquals(coll1, coll2)
не всегда работает. В случае, если это не удалось для меня, у меня было две коллекции, подкрепленные наборами. Ни hamcrest, ни junit не сказали, что коллекции были равны, хотя я точно знал, что они были. Используя CollectionUtils, он отлично работает.
Ответ 3
с hamcrest:
assertThat(s1, is(s2));
с равным утверждением:
assertEquals(s1, s2);
NB: t используется метод equals() класса конкретного набора
Ответ 4
Особенно интересен случай, когда вы сравниваете
java.util.Arrays$ArrayList<[[name,value,type], [name1,value1,type1]]>
и
java.util.Collections$UnmodifiableCollection<[[name,value,type], [name1,value1,type1]]>
До сих пор единственным решением, которое я вижу, является изменение их обоих в наборах
assertEquals(new HashSet<CustomAttribute>(customAttributes), new HashSet<CustomAttribute>(result.getCustomAttributes()));
Или я мог бы сравнить их элемент за элементом.
Ответ 5
В качестве дополнительного метода, основанного на массиве... вы можете рассмотреть использование неупорядоченных утверждений массива в junitx. Несмотря на то, что пример Apache CollectionUtils будет работать, там также есть pacakge твердых утверждений:
Я думаю, что
ArrayAssert.assertEquivalenceArrays(new Integer[]{1,2,3}, new Integer[]{1,3,2});
Подход будет более читабельным и отлаживаемым для вас (вся коллекция поддерживает toArray(), поэтому достаточно просто использовать методы ArrayAssert.
Конечно, недостатком является то, что junitx - дополнительный файл jar или запись maven...
<dependency org="junit-addons" name="junit-addons" rev="1.4"/>
Ответ 6
Отметьте эту статью. Один пример оттуда:
@Test
public void listEquality() {
List<Integer> expected = new ArrayList<Integer>();
expected.add(5);
List<Integer> actual = new ArrayList<Integer>();
actual.add(5);
assertEquals(expected, actual);
}
Ответ 7
Использование Hamcrest:
assertThat( set1, both(everyItem(isIn(set2))).and(containsInAnyOrder(set1)));
Это работает также, когда наборы имеют разные типы данных и отчеты о различии, а не просто сбой.
Ответ 8
Если вы хотите проверить, содержит ли List или Set набор определенных значений (вместо сравнения с уже существующей коллекцией), часто используется метод toString для коллекций:
String[] actualResult = calltestedmethod();
assertEquals("[foo, bar]", Arrays.asList(actualResult).toString());
List otherResult = callothertestedmethod();
assertEquals("[42, mice]", otherResult.toString());
Это немного короче, чем первое построение ожидаемой коллекции и сравнение ее с фактической коллекцией, и ее легче писать и исправлять.
(По общему признанию, это не особо чистый метод и не может отличить элемент "foo, bar" от двух элементов "foo" и "bar". Но на практике я считаю, что это наиболее важно, что это легко и быстро для написания тестов, иначе многие разработчики просто не будут нажимать.)