Согласно многим сообщениям, Assert.assertEquals
следует сравнивать коллекции, используя глубокую проницательность, и два массива одного и того же контента должны быть равны.Странное поведение Assert.assertEquals
У меня установлен JUnit 4.12.
Вызов
List<Integer[]> result, targetResult;
(both are created as ArrayList)
....
Assert.assertEquals("counted small array ", result, targetResult);
, где результат и targetResult имеют одинаковое содержание, тест не пройден, хотя.
Я посмотрел, как работают assertEquals
. Для сравнения массивов Integer он достиг:
//----in AbstractList:
public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof List))
return false;
ListIterator<E> e1 = listIterator();
ListIterator e2 = ((List) o).listIterator();
while (e1.hasNext() && e2.hasNext()) {
E o1 = e1.next();
Object o2 = e2.next();
if (!(o1==null ? o2==null : o1.equals(o2)))
return false;
...
//and more deep, in Object:
public boolean equals(Object obj) {
return (this == obj);
}
А это означает, что он сравнивает просто ссылки.
Как я могу сделать Assert.assertEquals()
правильно работать?
Интересно, где путаница. 'Assert.assertEquals', очевидно, вызывает' # equals' в одном из переданных аргументов, и это будет работать для коллекций, поскольку они переопределяют этот метод, но не будут работать для массивов. И не имеет значения, если вы передаете массивы в Assert.assertEquals' или завернуты в коллекции, так как эти массивы по-прежнему не переопределяют '# equals'. – Tom
@ Тома Ох. Итак, Assert.assertEquals просто НЕ работает в списке. Спасибо, пожалуйста, сделайте ответ из этого комментария - это ответ, который мне нужен ... Я вижу, что он работает так, но так много людей говорили по-другому, что я подумал, может быть, у меня есть дефектный JUnit ... –
Gangnus
' Assert.assertEquals' всегда одно и то же: вызывая '# equals', а коллекции также просто вызывают' # equals' из собранных объектов, поэтому вы в конечном итоге используете метод '# equals'' Anything [] 'и никаких массивов не делает переопределить '# equals', поэтому он фактически не сравнивает содержимое массива. Это способ, где «метод обхода», который сравнивает фактическое содержимое массива, например ['Arrays.equals()'] (https: // docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#equals%28boolean[],%20boolean[]%29) – Tom