Porównywanie tablic w asercjach JUnit, zwięzły sposób wbudowany?

Czy istnieje zwięzły, wbudowany sposób wykonywania twierdzeń równości na dwóch podobnych tablicach w JUnit? Domyślnie (przynajmniej w JUnit 4) wydaje się, że wykonuje porównanie instancji na samym obiekcie array.

NP, nie działa:

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

Oczywiście, mogę to zrobić ręcznie za pomocą:

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

..ale czy jest lepszy sposób?

Author: mBria, 2010-11-19

6 answers

Użyj org.junit.Metoda Assert assertArrayEquals:

import org.junit.Assert;
...

Assert.assertArrayEquals( expectedResult, result );

Jeśli ta metoda nie jest dostępna, być może przypadkowo zaimportowałeś klasę Assert z junit.framework.

 210
Author: Andy Thomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-12 19:46:08

Możesz użyć Arrays.equals(..):

assertTrue(Arrays.equals(expectedResult, result));
 33
Author: Bozho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-19 18:29:16

Wolę konwertować tablice na ciągi znaków:

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

W ten sposób widzę wyraźnie, gdzie są złe wartości. Działa to skutecznie tylko dla tablic o małych rozmiarach, ale rzadko używam tablic z większą liczbą elementów niż 7 w moich testach jednostkowych.

Ta metoda działa dla typów prymitywnych i dla innych typów, gdy przeciążenie toString zwraca wszystkie istotne informacje.

 11
Author: csharpfolk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-13 10:29:32
 10
Author: Michael Brewer-Davis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-19 18:41:52

Wiem, że pytanie dotyczy JUnit4, ale jeśli zdarzy ci się utknąć na JUnit3, możesz utworzyć krótką funkcję narzędziową w ten sposób:

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

W JUnit3 jest to lepsze niż bezpośrednie porównywanie tablic, ponieważ dokładnie wyszczególnia, które elementy są różne.

 2
Author: Haroldo_OK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-27 10:03:03

Używając junit4 i Hamcrest otrzymujesz zwięzłą metodę porównywania tablic. Podaje również szczegóły dotyczące tego, gdzie znajduje się błąd w śledzeniu awarii.

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

//...

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

Wyjście śledzenia awarii:

java.lang.AssertionError: 
   Expected: is [<56>, <100>, <2000>]
   but: was [<55>, <100>, <2000>]
 0
Author: winstanr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-05 06:17:31