JUnit 4 сравнить наборы - PullRequest
       18

JUnit 4 сравнить наборы

93 голосов
/ 22 февраля 2010

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

Ответы [ 9 ]

94 голосов
/ 22 февраля 2010

Вы можете утверждать, что два Set равны друг другу, что вызывает метод Set equals() .

public class SimpleTest {

    private Set<String> setA;
    private Set<String> setB;

    @Before
    public void setUp() {
        setA = new HashSet<String>();
        setA.add("Testing...");
        setB = new HashSet<String>();
        setB.add("Testing...");
    }

    @Test
    public void testEqualSets() {
        assertEquals( setA, setB );
    }
}

Это @Test пройдет, если два Set имеют одинаковый размер и содержат одинаковые элементы.

39 голосов
/ 18 января 2012

Apache снова приходит на помощь.

assertTrue(CollectionUtils.isEqualCollection(coll1, coll2));

Работает как шарм. Я не знаю почему, но я обнаружил, что с коллекциями следующее assertEquals(coll1, coll2) не всегда работает. В случае, если это не помогло мне, у меня было две коллекции, подкрепленные Сетями. Ни Хэмкрест, ни Джунит не сказали бы, что коллекции равны, хотя я точно знал, что они были. Используя CollectionUtils, он отлично работает.

14 голосов
/ 22 февраля 2010

с подголовником :

assertThat(s1, is(s2));

с простым утверждением:

assertEquals(s1, s2);

Примечание: t используется метод equals () класса конкретного набора

7 голосов
/ 30 августа 2010

Особенно интересен случай, когда вы сравниваете

   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()));

Или я мог бы сравнить их поэлементно.

4 голосов
/ 19 марта 2012

В качестве дополнительного метода на основе массива ... вы можете рассмотреть использование неупорядоченных утверждений массива в junitx. Хотя пример Apache CollectionUtils будет работать, там также есть пакет расширений твердых утверждений:

Я думаю, что

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"/>
2 голосов
/ 22 февраля 2010

Отметьте эту статью . Один пример оттуда:

@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);  
}  
1 голос
/ 24 мая 2017

Использование Hamcrest:

assertThat( set1, both(everyItem(isIn(set2))).and(containsInAnyOrder(set1)));

Это также работает, когда наборы имеют разные типы данных, и сообщает о разнице, а не просто об ошибке.

0 голосов
/ 14 января 2018

Мне нравится решение Ханса-Петера Штерра ... Но я думаю, что оно не совсем корректно.К сожалению, containsInAnyOrder не принимает Collection объектов для сравнения.Таким образом, это должно быть Collection из Matcher s:

assertThat(set1, containsInAnyOrder(set2.stream().map(IsEqual::equalTo).collect(toList())))

Импорт:

import static java.util.stream.Collectors.toList;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.junit.Assert.assertThat;
0 голосов
/ 16 августа 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...