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

JUnit 4 сравнить коллекции

Как бы вы кратко заявили о равенстве элементов collections, а именно Set в JUnit 4?

4b9b3361

Ответ 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". Но на практике я считаю, что это наиболее важно, что это легко и быстро для написания тестов, иначе многие разработчики просто не будут нажимать.)