Как сравнить два списка на основе элементов, которые он содержит? - PullRequest
0 голосов
/ 28 июля 2011

В моем классе модульных тестов у меня есть два списка.Одним из них является expectedValue, а другим - returnedType.

Я делаю

Collections.sort(expected);
Collections.sort(returned);

, но как мне сравнить два списка на основе типа значения одного из его элементов?Например, у меня есть элемент sortOrder в обоих списках, и он имеет значения от 1,2 or 3, так как мне сравнить или сказать сделать что-то вроде assertEqual(expected, returned) for both the list и убедиться, что оба списка имеют одинаковые элементы и имеют одинаковые элементы значений sortOrder?в правильном формате сортировки?

Примечание: Мне не следует использовать какие-либо внешние библиотеки для этого.

Обновление

Пример моего возвращения и ожидаемого списка:

excepted List = [Code: ANALYST, SortOrder: 2, Code: STREET, SortOrder: 1] и returned List = [Code: STREET, SortOrder: 1, Code: ANALYST, SortOrder: 2]

Итак, очень простой вопрос: как я могу отсортировать список по одному из значений его элемента в нашемпример в соответствии со значением sortOrder, поэтому ожидаемое значение должно быть

excepted List = [Code: STREET, SortOrder: 1, Code: ANALYST, SortOrder: 2]

Ответы [ 6 ]

2 голосов
/ 28 июля 2011

Чтобы расширить ответ Богемиана (+1), Hamcrest - очень хороший способ сделать это. Вот пример:

assertThat(myListOfIntegers, contains(1, 2, 3));

Matchers.contains утверждает, что элементы списка имеют правильный тип, правильное количество и в правильном порядке. Поэтому в приведенном выше утверждении я ожидаю, что myListOfIntegers будет точным списком: [1, 2, 3].

2 голосов
/ 28 июля 2011

Взгляните на Hamcrest - библиотека соответствий для построения тестовых выражений.

Он предлагает множество методов для сравнения коллекций (и других трудно сравниваемых классов) и специальных сопоставителей, которые сообщают вам , почему коллекции не совпадают при выдаче AssertionErrors

2 голосов
/ 28 июля 2011

Использование equals().

1 голос
/ 28 июля 2011

Убедитесь, что объекты в списке переопределяют методы equals и hashcode, но в противном случае вы можете просто сравнить списки напрямую согласно контракту java.util.List, который утверждает, что они равны, если списки содержат одинаковые объектытот же заказ.

http://download.oracle.com/javase/6/docs/api/java/util/List.html#equals(java.lang.Object)

0 голосов
/ 17 октября 2012

Попробуйте использовать это: CollectionUtils.isEqualCollection (ожидается, возвращено);

0 голосов
/ 28 июля 2011

Edit:

Лучший способ сделать

assertEquals(expected, returned);

потому что AbstractList реализует равно, используя парное сравнение. Если вы не уверены, что списки, которые вы получаете, наследуются от AbstractList, вы всегда можете сделать

assertEquals(new ArrayList(expected), new ArrayList(returned));

Оставляю остаток ответа в документальных целях (и чтобы не скрывать свое позорное невежество)

Хотите ли вы утверждать, что списки также в правильном порядке?

public static void assertEquals(List expected, List returned)
{
    assertEquals(expected.size(), returned.size());
    if(!expected.containsAll(returned))
    {
       fail();
    }

    for(int i = 0; i < expected.size(); i++)
    {
        assertEquals(expected.get(i),returned.get(i));
    }
}
...