2010-11-19 9 views
84

Gibt es eine prägnante, integrierte Möglichkeit, in JUnit gleichartige Assertions auf zwei gleichartigen Arrays auszuführen? Standardmäßig (zumindest in JUnit 4) scheint es, dass ein Instanzenvergleich für das Array-Objekt selbst durchgeführt wird.Vergleichen von Arrays in JUnit Assertions, prägnante integrierte?

EG, nicht funktioniert:

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

Natürlich kann ich es tun manuell mit:

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

..aber gibt es einen besseren Weg?

Antwort

175

Verwenden org.junit.Assert ‚s Methode assertArrayEquals:

import org.junit.Assert; 
... 

Assert.assertArrayEquals(expectedResult, result); 

Wenn diese Methode nicht verfügbar ist, können Sie versehentlich die Assert Klasse importiert haben von junit.framework.

30

können Sie verwenden Arrays.equals(..):

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

Was stinkt über dass, obwohl ist, dass Sie keine Daten zu bekommen, was schief gelaufen ist, wenn es fehlschlägt. – mBria

+7

Schön, wenn Sie auf einer älteren Junit-Version sind (wie auf Android) – Zitrax

+0

Wenn Sie sehen wollen, welche Bytes nicht übereinstimmen, können Sie sie in string konvertieren: assertEquals (Arrays.toString (expectedResult), Arrays.toString (result)) ; – Erdem

10
+1

Hm, ich sehe in meiner 'junit.framework.Assert' keine 'assertArrayEquals'? – mBria

+1

@mBria Upgrade Ihrer Junit – Bozho

+0

4.8.1 ist, was ich habe, und was scheint, die neuesten verfügbaren über Maven (http://grepcode.com/search?query=junit+4.9&start=0&entity=type&n=). Ist es nur in 4.8.2 oder 4.9? – mBria

2

Ich weiß, die Frage nach JUnit4 ist, aber wenn man sich JUnit3 stecken werden passieren, könnten Sie eine kurze Nutzenfunktion wie das erstellen:

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

In JUnit3, das ist besser als direkt die Arrays zu vergleichen , da genau beschrieben wird, welche Elemente unterschiedlich sind.

8

ziehe ich Arrays in Strings konvertieren:

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

diese Weise kann ich klar sehen können, wo falsche Werte sind. Dies funktioniert effektiv nur für kleine Arrays, aber ich verwende selten Arrays mit mehr Elementen als 7 in meinen Unit-Tests.

Diese Methode funktioniert für primitive Typen und für andere Typen, wenn die Überladung von alle wichtigen Informationen zurückgibt.

0

Mit junit4 und Hamcrest erhalten Sie eine präzise Methode zum Vergleichen von Arrays. Es gibt auch Details darüber, wo sich der Fehler in der Fehlerverfolgung befindet.

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

//... 

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

Failure Trace-Ausgabe:

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