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?

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.


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));

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.



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>]

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.