Confrontando le matrici nelle asserzioni di JUnit, in modo conciso e integrato?


159

Esiste un modo conciso e integrato per fare uguagliare asserzioni su due array simili a JUnit? Per impostazione predefinita (almeno in JUnit 4) sembra fare un confronto di istanza sull'oggetto array stesso.

Ad esempio, non funziona:

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

Certo, posso farlo manualmente con:

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

..ma c'è un modo migliore?

Risposte:


298

Usa il metodo org.junit.AssertassertArrayEquals :

import org.junit.Assert;
...

Assert.assertArrayEquals( expectedResult, result );

Se questo metodo non è disponibile, è possibile che sia stata importata accidentalmente la classe Assert da junit.framework.


ma tutto ciò che ottieni quando fallisce per una lunghezza diversa è java.lang.AssertionError: array lengths differed, expected.length=6 actual.length=7. Poiché la maggior parte dei messaggi di errore di JUnit non è così utile ... Consiglio di utilizzare un framework di asserzioni
user1075613

1
@ user1075613 - Lo trovo utile. Abbiamo affermato che le matrici erano uguali, non lo sono e ci viene data un'indicazione del perché. Da lì, possiamo impostare un punto di interruzione ed esaminare in dettaglio gli array.
Andy Thomas,

1
giusto, è - un po '- utile. Tuttavia, quando lo fai notare, nell'istante in cui ricevi questo messaggio ti chiedi "perché non è della stessa lunghezza?" quindi vuoi controllare il contenuto. Perché perdere tempo con un debugger quando un buon messaggio di errore potrebbe dirlo direttamente? (sicuro che a volte hai ancora bisogno del debugger ma la maggior parte delle volte no)
user1075613

È possibile inviare problemi al sistema di tracciamento dei problemi di JUnit . Tieni presente, tuttavia, che 1) il fallimento veloce, in O (1), può essere un vantaggio, 2) l'output del fallimento dell'asserzione non dovrebbe essere O (n). Il sistema di tracciamento dei problemi di JUnit è un forum migliore per ulteriori discussioni.
Andy Thomas,

1
@anddero - Assert.assertFalse( Arrays.equals( expectedResult, result )).
Andy Thomas,

35

Puoi usare Arrays.equals(..):

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

14
Ciò che puzza di questo è che non si ottengono dati su ciò che è andato storto quando fallisce.
mBria,

8
Bello quando sei su una versione junit precedente (come su Android)
Zitrax

2
Se vuoi vedere quali byte non corrispondono, puoi convertirli in stringa: assertEquals (Arrays.toString (expectedResult), Arrays.toString (risultato));
Erdem,

17

Preferisco convertire le matrici in stringhe:

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

in questo modo posso vedere chiaramente dove sono i valori sbagliati. Funziona in modo efficace solo per array di piccole dimensioni, ma raramente utilizzo array con più articoli di 7 nei test delle unità.

Questo metodo funziona per tipi primitivi e per altri tipi quando il sovraccarico di toStringrestituisce tutte le informazioni essenziali.



4

Usando junit4 e Hamcrest si ottiene un metodo conciso per confrontare le matrici. Fornisce inoltre dettagli su dove si trova l'errore nella traccia dell'errore.

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

//...

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

Uscita traccia errore:

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

2

So che la domanda è per JUnit4, ma se ti capita di rimanere bloccato su JUnit3, potresti creare una breve funzione di utilità come quella:

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

In JUnit3, è meglio che confrontare direttamente le matrici, dal momento che descriverà esattamente quali elementi sono diversi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.