Как я могу проверить два массива объектов на равенство в JUnit?

У меня есть класс JAVA NoName, объекты которого имеют метод getProperties(). Этот метод возвращает массив Property. Теперь, когда у меня есть два экземпляра NoName, как я могу использовать assertEquals, чтобы проверить, совпадают ли Property-массивы обоих экземпляров?

_assertEquals(inst.getProperties(), ance.getProrties())_ не подойдет, потому что он устарел.

И поскольку класс NoName является библиотечным классом, я не могу перезаписать equals() (что, насколько я читал до сих пор, кажется обычным решением для такого рода проблем). ).

Заранее спасибо.


person keinabel    schedule 06.06.2012    source источник
comment
Возможный дубликат Сравнение массивов в утверждениях JUnit, краткий встроенный способ ?   -  person Joe    schedule 23.10.2015


Ответы (4)


assertThat(ob1.getProperties(), 
    IsArrayContainingInOrder.contains(obj2.getProperties));

Здесь используется Hamcrest Matcher, который я считаю предпочтительным методом для выполнения утверждений, поскольку вывод при сбое гораздо более нагляден.

Также есть IsArrayContainingInAnyOrder, если порядок не имеет значения.

IsArrayContainingInAnyOrder

person John B    schedule 06.06.2012
comment
Это специальная библиотека, которую я должен включить в свое рабочее пространство? Потому что тогда это не будет работать. - person keinabel; 11.06.2012
comment
Он находится в библиотеке Hamcrest. Небольшая часть Hamcrest Matchers поставляется в банке JUnit, а остальные находятся в банках Hamcrest-core и Hamcrest-all. Я рекомендую вам перечислить эти два jar-файла раньше в пути к классам, чем jar-файл JUnit, чтобы гарантировать, что вы получите эти сопоставления раньше, чем сопоставители JUnit по умолчанию. - person John B; 11.06.2012

Поскольку вы говорите о сравнении внутренней структуры объекта, вы можете либо переопределить метод equals для класса NoName, а внутри этого сравнить массив свойств для обоих объектов. Но тогда вам нужно будет позаботиться и о методе hashCode.

Или вы можете просто создать вспомогательный метод hasSameProperties(NoName obj) в классе NoName и заставить этот метод возвращать логический флаг после сравнения массивов свойств обоих объектов. Затем в JUnit вы можете просто использовать метод assertTrue.

person anirvan    schedule 06.06.2012
comment
Я не могу писать в класс NoName. Это часть библиотеки. - person keinabel; 06.06.2012

Property[] one = inst.getProperties(), two = ance.getProperties();
assertEquals(one.length, two.length);
for (int i=0; i<one.length; i++) assertEquals("index #" + i, one[i], two[i]);

Это обеспечивает базовый скраб. Если вас беспокоят какие-то другие граничные условия (например, массив может быть нулевым или что массиву разрешено иметь другой порядок, если в каждом из них находятся все одинаковые элементы), то потребуется дополнительная работа. (например, проверка нуля, сортировка, если Property реализует Comparable).

person Carl    schedule 06.06.2012
comment
Хотя я думаю, что Hamcrest здесь является лучшим вариантом, если этот механизм используется, должна быть указана причина: assertEquals("index #" + i, one[i], two[i]); в противном случае предоставленное сообщение об ошибке будет бесполезным. - person John B; 06.06.2012
comment
@John B: отличное замечание, я внесу коррективы в ответ. относительно Hamcrest, да, но: это вопрос проектирования, который зависит от масштаба — от организации, проводящей тестирование, от тестирования этого кода и т. д. Если это быстрый способ (например, junit для помощи в мелкомасштабной отладке), больше проблем с сортировкой правильного пути к библиотеке, чем любая дополнительная информация. - person Carl; 06.06.2012
comment
Ах, красота Мейвен. Я всегда просто думаю: «О, я просто добавлю эту зависимость». - person John B; 06.06.2012

Hamcrest 1.3 использует немного другой синтаксис, некоторые примеры:

import static org.hamcrest.collection.IsArrayContainingInOrder.arrayContaining;

...

@Test
public void inOrder1() {
    assertThat(new String[]{"foo", "bar"}, arrayContaining(equalTo("foo"), equalTo("bar")));
}

@Test(expected =  AssertionError.class)
public void inOrder2() {
    assertThat(new String[]{"bar", "foo"}, arrayContaining(equalTo("foo"), equalTo("bar")));
    // Expected: ["foo", "bar"]
    //      but: item 0: was "bar"
}

@Test(expected =  AssertionError.class)
public void inOrder3() {
    assertThat(new String[]{"foo", "bar", "lux"}, arrayContaining(equalTo("foo"), equalTo("bar")));
    // Expected: ["foo", "bar"] in any order
    //      but: Not matched: "lux"
}

@Test(expected =  AssertionError.class)
public void inOrder4() {
    assertThat(new String[]{"foo", "bar"}, arrayContaining(equalTo("foo"), equalTo("bar"), equalTo("lux")));
    // Expected: ["foo", "bar", "lux"] in any order
    //      but: No item matched: "lux" in ["foo", "bar"]
}
person Oscar Scholten    schedule 23.10.2015