Vergleichen Sie Arrays in JUnit-Assertions.

158

Gibt es eine prägnante, integrierte Methode, um gleichwertige Aussagen für zwei gleichartige Arrays in JUnit zu treffen? Standardmäßig (zumindest in JUnit 4) scheint es einen Instanzvergleich für das Array-Objekt selbst durchzuführen.

EG, funktioniert nicht:

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

Natürlich kann ich es manuell machen 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?

mBria
quelle

Antworten:

295

Verwenden Sie die Methode von org.junit.AssertassertArrayEquals :

import org.junit.Assert;
...

Assert.assertArrayEquals( expectedResult, result );

Wenn diese Methode nicht verfügbar ist, haben Sie möglicherweise versehentlich die Assert-Klasse aus importiert junit.framework.

Andy Thomas
quelle
Aber alles, was Sie bekommen, wenn es für unterschiedliche Länge fehlschlägt, ist java.lang.AssertionError: array lengths differed, expected.length=6 actual.length=7. Wie die meisten JUnit-
Fehlermeldungen ist
1
@ user1075613 - Ich finde es hilfreich. Wir haben behauptet, die Arrays seien gleich, sie sind es nicht, und wir erhalten einen Hinweis darauf, warum. Von dort aus können wir einen Haltepunkt setzen und die Arrays im Detail untersuchen.
Andy Thomas
1
Richtig, es ist - ein bisschen - hilfreich. Wie Sie jedoch darauf hinweisen, fragen Sie sich in dem Moment, in dem Sie diese Nachricht erhalten, "warum sie nicht gleich lang ist?". Sie möchten also den Inhalt überprüfen. Warum mit einem Debugger Zeit verlieren, wenn eine gute Fehlermeldung dies direkt erkennen kann? (Sicher, Sie brauchen den Debugger manchmal noch, aber meistens nicht)
user1075613
Sie können Probleme an das Problemverfolgungssystem von JUnit senden . Beachten Sie jedoch, dass 1) ein schneller Ausfall in O (1) von Vorteil sein kann, 2) die Ausgabe eines Assertionsfehlers nicht O (n) sein sollte. Das JUnit Issue Tracking System ist ein besseres Forum für weitere Diskussionen.
Andy Thomas
1
@anddero - Assert.assertFalse( Arrays.equals( expectedResult, result )).
Andy Thomas
35

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

assertTrue(Arrays.equals(expectedResult, result));
Bozho
quelle
14
Was daran stinkt, ist, dass Sie KEINE Daten darüber erhalten, was schief gelaufen ist, wenn es fehlschlägt.
mBria
8
Schön, wenn Sie auf einer älteren Junit-Version sind (wie auf Android)
Zitrax
2
Wenn Sie sehen möchten, welche Bytes nicht übereinstimmen, können Sie sie in einen String konvertieren: assertEquals (Arrays.toString (expectedResult), Arrays.toString (result));
Erdem
17

Ich ziehe es vor, Arrays in Strings umzuwandeln:

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

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

Diese Methode funktioniert für primitive Typen und für andere Typen, wenn bei Überladung toStringalle wichtigen Informationen zurückgegeben werden.

csharpfolk
quelle
4

Mit junit4 und Hamcrest erhalten Sie eine übersichtliche Methode zum Vergleichen von Arrays. Außerdem werden Details dazu angegeben, 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}));

Fehlerverfolgungsausgabe:

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

Ich weiß, dass die Frage für JUnit4 ist, aber wenn Sie bei JUnit3 stecken bleiben, können Sie eine kurze Dienstprogrammfunktion wie diese erstellen:

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

In JUnit3 ist dies besser als ein direkter Vergleich der Arrays, da genau angegeben wird, welche Elemente unterschiedlich sind.

Haroldo_OK
quelle