Сравнивая массивы в утверждениях JUnit, сжатый встроенный способ - PullRequest
131 голосов
/ 19 ноября 2010

Есть ли в JUnit сжатый, встроенный способ сделать утверждения равенства для двух массивов одинакового типа? По умолчанию (по крайней мере, в JUnit 4) кажется, что выполняется сравнение экземпляров самого объекта массива.

EG, не работает:

int[] expectedResult = new int[] { 116800,  116800 };
int[] result = new GraphixMask().sortedAreas(rectangles);
assertEquals(expectedResult, result);

Конечно, я могу сделать это вручную с помощью:

assertEquals(expectedResult.length, result.length);
for (int i = 0; i < expectedResult.length; i++)
    assertEquals("mismatch at " + i, expectedResult[i], result[i]);

.. но есть ли лучший способ?

Ответы [ 6 ]

251 голосов
/ 19 ноября 2010

Использование org.junit.Assert метод assertArrayEquals:

import org.junit.Assert;
...

Assert.assertArrayEquals( expectedResult, result );

Если этот метод недоступен, возможно, вы случайно импортировали класс Assert из junit.framework.

34 голосов
/ 19 ноября 2010

Вы можете использовать Arrays.equals(..):

assertTrue(Arrays.equals(expectedResult, result));
15 голосов
/ 13 февраля 2016

Я предпочитаю преобразовывать массивы в строки:

Assert.assertEquals(
                Arrays.toString(values),
                Arrays.toString(new int[] { 7, 8, 9, 3 }));

таким образом, я могу ясно видеть, где находятся неправильные значения.Это эффективно работает только для массивов небольшого размера, но я редко использую массивы с элементами больше, чем 7. В моих модульных тестах.

Этот метод работает для примитивных типов и для других типов, когда перегрузка toString возвращает всю важную информацию.

10 голосов
/ 19 ноября 2010
3 голосов
/ 05 сентября 2017

Используя junit4 и Hamcrest , вы получаете краткий метод сравнения массивов.В нем также подробно описывается, где находится ошибка в трассировке ошибок.

import static org.junit.Assert.*
import static org.hamcrest.CoreMatchers.*;

//...

assertThat(result, is(new int[] {56, 100, 2000}));

Выход трассировки ошибок:

java.lang.AssertionError: 
   Expected: is [<56>, <100>, <2000>]
   but: was [<55>, <100>, <2000>]
2 голосов
/ 27 января 2016

Я знаю, что вопрос касается JUnit4, но если вы застряли в JUnit3, вы можете создать короткую служебную функцию, например:

private void assertArrayEquals(Object[] esperado, Object[] real) {
    assertEquals(Arrays.asList(esperado), Arrays.asList(real));     
}

В JUnit3 это лучше, чем прямое сравнениемассивы, так как он будет подробно описывать, какие элементы отличаются.

...