2010-11-19 9 views
84

Czy istnieje zwięzły, wbudowany sposób na zapewnienie asercji równych na dwóch tablicach typu "jak napisano" w JUnit? Domyślnie (przynajmniej w JUnit 4) wydaje się, że porównuje instancję samego obiektu tablicy.Porównywanie tablic w asercji JUnit, zwięzłe wbudowane?

EG, nie działa:

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

Oczywiście, można to zrobić ręcznie:

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

..ale czy istnieje lepszy sposób?

Odpowiedz

175

Zastosowanie org.junit.Assert „s metody assertArrayEquals:

import org.junit.Assert; 
... 

Assert.assertArrayEquals(expectedResult, result); 

Jeśli ta metoda nie jest dostępna, można przypadkowo importowane klasę Assert od junit.framework.

30

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

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

Co śmierdzi o tym choć to nie dostaniesz dane o tym, co poszło nie tak, gdy nie powiedzie się. – mBria

+7

Przyjemnie, gdy używasz starszej wersji junitowej (jak na Androidzie) – Zitrax

+0

Jeśli chcesz zobaczyć, które bajty się nie zgadzają, możesz przekonwertować je na ciąg: assertEquals (Arrays.toString (expectedResult), Arrays.toString (result)) ; – Erdem

10
+1

Hm, nie widzę żadnych "assertArrayEquals" w moim "junit.framework.Assert"? – mBria

+1

@mBria uaktualnij junitę – Bozho

+0

4.8.1 jest to, co mam i co wydaje się być najnowsze dostępne za pośrednictwem Mavena (http://grepcode.com/search?query=junit+4.9&start=0&entity=type&n=). Czy jest to tylko w 4.8.2 lub 4.9? – mBria

2

Wiem, że pytanie jest dla JUnit4, ale jeśli zdarzy ci się być zatrzymany w JUnit3 można utworzyć krótką funkcję użytkową tak:

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

W JUnit3, to jest lepsze niż bezpośrednio porównując tablice , ponieważ szczegółowo określi, które elementy są różne.

8

wolę konwersji tablic na ciągi znaków:

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

ten sposób widzę wyraźnie, gdzie wartości są błędne. Działa to skutecznie tylko w przypadku małych tablic, ale rzadko korzystam z tablic z większą liczbą elementów niż 7 w testach jednostkowych.

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

0

Za pomocą junit4 i Hamcrest otrzymujesz zwięzłą metodę porównywania tablic. Podaje także szczegóły 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 Awaria Ślad:

java.lang.AssertionError: 
    Expected: is [<56>, <100>, <2000>] 
    but: was [<55>, <100>, <2000>]