Как я могу сделать утверждение равенства между списками в тестовом примере JUnit ? Равенство должно быть между содержанием списка.
Например:
List<String> numbers = Arrays.asList("one", "two", "three");
List<String> numbers2 = Arrays.asList("one", "two", "three");
List<String> numbers3 = Arrays.asList("one", "two", "four");
// numbers should be equal to numbers2
//numbers should not be equal to numbers3
java
unit-testing
collections
junit
Камаль
источник
источник
assertArrayEquals
настоящее время. Используйте в сочетании сList#toArray
.assertArrayEquals
требует, чтобы вы получили массивы из ваших списков. Вы можете работать непосредственно со списком, используяassertIterableEquals
assertIterableEquals
доступно для jUnit5 @ThetaSinnerОтветы:
Я понимаю, что об этом спросили пару лет назад, возможно, этой функции тогда не было. Но теперь легко сделать это:
Если у вас установлена последняя версия Junit с Hamcrest, просто добавьте этот импорт:
http://junit.org/junit4/javadoc/latest/org/junit/Assert.html#assertThat(T, org.hamcrest.Matcher)
http://junit.org/junit4/javadoc/latest/org/hamcrest/CoreMatchers.html
http://junit.org/junit4/javadoc/latest/org/hamcrest/core/Is.html
источник
System.out.println(actual == expected);
вернет ложь, ноSystem.out.println(actual.equals(expected));
вернет истину..equals(..)
вместо==
?Не преобразовывайте в строку и не сравнивайте. Это не хорошо для исполнения. В junit, внутри Corematchers, есть подходящее средство для этого =>
hasItems
Это лучший из известных мне способов проверки элементов в списке.
источник
Assert.assertEquals(4,yourList.size());
assertThat(yourList.toArray(), arrayContainingInAnyOrder(1,2,3,4,5));
toString()
версию не лучший способ.Это устаревший ответ, подходящий для JUnit 4.3 и ниже. Современная версия JUnit включает в себя встроенные читаемые сообщения об ошибках в методе assertThat. Предпочитаю другие ответы на этот вопрос, если это возможно.
Для записи, как @Paul упомянул в своем комментарии к этому ответу, два
List
s равны:Смотрите JavaDocs
List
интерфейса .источник
assertEquals(Object, Object)
от JUnit4 / JUnit 5 илиassertThat(actual, is(expected));
из Hamcrest предложенных в других ответах будет работать только какequals()
иtoString()
переопределяются для классов (и глубоко) сравниваемых объектов.Это важно, потому что проверка на равенство в утверждении основывается,
equals()
а сообщение о сбое теста опирается наtoString()
сравниваемые объекты.Для встроенных классов, таких как
String
,Integer
и так для ... нет проблем, так как они переопределяютequals()
иtoString()
. Так что это совершенно справедливо, чтобы утверждатьList<String>
илиList<Integer>
сassertEquals(Object,Object)
.И по этому поводу: вы должны переопределить
equals()
в классе, потому что это имеет смысл с точки зрения равенства объектов, а не только для упрощения утверждений в тесте с JUnit.Чтобы сделать утверждения проще, у вас есть другие способы.
В качестве хорошей практики я предпочитаю библиотеки утверждений / сопоставлений.
Вот решение AssertJ .
org.assertj.core.api.ListAssert.containsExactly()
это то, что вам нужно: он проверяет, что фактическая группа содержит именно заданные значения и ничего больше, в порядке, указанном в javadoc.Предположим,
Foo
класс, где вы добавляете элементы и где вы можете получить это.В модульном тесте
Foo
этого утверждается, что оба списка имеют одинаковое содержимое:Хорошая мысль AssertJ заключается в том, что объявление «
List
как ожидается» не нужно: оно делает утверждение более понятным, а код - более читабельным:Но библиотеки Assertion / matcher являются обязательными, потому что они действительно будут дальше.
Предположим теперь, что
Foo
не хранитString
s, аBar
s экземпляров.Это очень распространенная потребность. С AssertJ утверждение все еще просто написать. Лучше вы можете утверждать, что содержимое списка равно, даже если класс элементов не переопределяет, в
equals()/hashCode()
то время как способ JUnit требует, чтобы:источник
Если вам не
ListAssert.assertEquals
важен порядок элементов, я рекомендую в junit-addons.Ссылка: http://junit-addons.sourceforge.net/
Для ленивых пользователей Maven:
источник
Вы можете использовать assertEquals в junit.
Если порядок элементов отличается, он вернет ошибку.
источник
если вы не хотите создавать список массивов, вы можете попробовать это также
источник
источник
Не изобретай велосипед!
Есть библиотека Google Code, которая сделает это за вас: Hamcrest
источник
Я знаю, что уже есть много вариантов решения этой проблемы, но я бы предпочел сделать следующее для утверждения двух списков в любой команде :
источник
assertEquals(expected, result);
работает для меня. Поскольку эта функция получает два объекта, вы можете передать ей все что угодно.источник
Я не думаю, что все приведенные выше ответы дают точное решение для сравнения двух списков объектов. Большинство из вышеперечисленных подходов могут быть полезны только в следующих пределах сравнений - Сравнение размеров - Сравнение сравнений
Но если у нас есть списки объектов одинакового размера и разные данные на уровне объектов, тогда это сравнение не поможет.
Я думаю, что следующий подход будет отлично работать с переопределением equals и методом хэш-кода для пользовательского объекта.
Я использовал Xstream lib для переопределения equals и hashcode, но мы можем переопределить equals и hashcode, даже выиграв логику / сравнение.
Вот пример для вашей справки
Самое главное, что вы можете игнорировать поля с помощью Annotation (@XStreamOmitField), если вы не хотите включать какие-либо поля в одинаковую проверку объектов. Существует множество подобных аннотаций для настройки, поэтому внимательно изучите аннотации этой библиотеки.
Я уверен, что этот ответ сэкономит ваше время, чтобы определить правильный подход для сравнения двух списков объектов :). Пожалуйста, прокомментируйте, если вы видите какие-либо проблемы по этому вопросу.
источник