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?
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
.
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));
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.
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
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.
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>]
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