Порівнюючи масиви у твердженнях JUnit, стислий вбудований спосіб?


159

Чи є стислий, вбудований спосіб зробити рівне твердженням на двох масивах типу типу в 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]);

..але є кращий спосіб?

Відповіді:


298

Використовуйте org.junit.Assert метод «S assertArrayEquals:

import org.junit.Assert;
...

Assert.assertArrayEquals( expectedResult, result );

Якщо цей метод недоступний, можливо, ви випадково імпортували клас Assert з junit.framework.


але все, що ви отримуєте, коли не виходить різної довжини, - це java.lang.AssertionError: array lengths differed, expected.length=6 actual.length=7. Як і більшість повідомлень про відмову в JUnit, це не так корисно ... Раджу скористатись якоюсь рамкою твердження
user1075613

1
@ user1075613 - Я вважаю це корисним. Ми стверджували, що масиви рівні, їх немає, і нам вказують, чому. Звідти ми можемо встановити точку розриву та детально вивчити масиви.
Енді Томас

1
правильно, це - трохи - корисно. Однак, як ви вказуєте, щоразу, коли ви отримаєте це повідомлення, ви запитуєте себе "чому це не однакової довжини?" тому ви хочете перевірити вміст. Навіщо втрачати час за допомогою налагоджувача, коли гарне повідомлення про помилку може сказати це безпосередньо? (впевнений, що ви все ще потребуєте налагоджувача іноді, але більшу частину часу у вас немає)
user1075613

Ви можете подати проблеми до системи відстеження випусків JUnit . Майте на увазі, що 1) невдала швидкість, в O (1), може бути перевагою; 2) вихід недостатності твердження не повинен бути O (n). Система відстеження випусків JUnit - кращий форум для подальшого обговорення.
Енді Томас

1
@anddero - Assert.assertFalse( Arrays.equals( expectedResult, result )).
Енді Томас

35

Ви можете використовувати Arrays.equals(..):

assertTrue(Arrays.equals(expectedResult, result));

14
Що смердить з цього приводу, це те, що ви отримуєте НЕ дані про те, що пішло не так, коли це не вдається.
mBria

8
Приємно, коли ви переглядаєте старішу версію (наприклад, на Android)
Zitrax

2
Якщо ви хочете побачити, які байти не відповідають, можете перетворити їх у рядок: assertEquals (Arrays.toString (очакванийРезультат), Arrays.toString (результат));
Ердем

17

Я вважаю за краще перетворити масиви в рядки:

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

таким чином я чітко бачу, де неправильні значення. Це ефективно працює лише для масивів невеликого розміру, але я рідко використовую масиви з більшою кількістю елементів, ніж 7, в моїх тестових одиницях.

Цей метод працює як для примітивних типів, так і для інших типів, коли перевантаження toStringповертає всю необхідну інформацію.



4

Використовуючи 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

Я знаю, що питання стосується JUnit4, але якщо у вас трапиться JUnit3, ви можете створити коротку функцію утиліти, як:

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

У JUnit3 це краще, ніж безпосередньо порівнювати масиви, оскільки він детально деталізує, які елементи відрізняються.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.