Comparer des tableaux dans les assertions JUnit, de manière intégrée concise?

159

Existe-t-il une manière concise et intégrée de faire des assertions égales sur deux tableaux de même type dans JUnit? Par défaut (au moins dans JUnit 4), il semble faire une comparaison d'instance sur l'objet tableau lui-même.

EG, ne fonctionne pas:

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

Bien sûr, je peux le faire manuellement avec:

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

..Mais y a-t-il une meilleure façon?

mBria
la source

Réponses:

298

Utilisez la méthode de org.junit.AssertassertArrayEquals :

import org.junit.Assert;
...

Assert.assertArrayEquals( expectedResult, result );

Si cette méthode n'est pas disponible, vous avez peut-être importé accidentellement la classe Assert depuis junit.framework.

Andy Thomas
la source
mais tout ce que vous obtenez quand il échoue pour une longueur différente est java.lang.AssertionError: array lengths differed, expected.length=6 actual.length=7. Comme la plupart des messages d'échec JUnit, ce n'est pas si utile ... Je vous conseille d'utiliser un cadre d'assertion
user1075613
1
@ user1075613 - Je trouve cela utile. Nous avons affirmé que les tableaux étaient égaux, ils ne le sont pas, et on nous explique pourquoi. À partir de là, nous pouvons définir un point d'arrêt et examiner les tableaux en détail.
Andy Thomas
1
à droite, c'est - un peu - utile. Cependant, comme vous le faites remarquer, à l'instant où vous recevez ce message, vous vous demandez "pourquoi ce n'est pas la même longueur?" vous voulez donc vérifier le contenu. Pourquoi perdre du temps avec un débogueur alors qu'un bon message d'erreur pourrait le dire directement? (Bien sûr, vous avez toujours besoin du débogueur parfois, mais la plupart du temps vous n'en avez pas)
user1075613
Vous pouvez soumettre les problèmes au système de suivi des problèmes de JUnit . Gardez à l'esprit, cependant, que 1) l'échec rapide, dans O (1), peut être un avantage, 2) la sortie d'échec d'assertion ne doit pas être O (n). Le système de suivi des problèmes JUnit est un meilleur forum pour une discussion plus approfondie.
Andy Thomas
1
@anddero - Assert.assertFalse( Arrays.equals( expectedResult, result )).
Andy Thomas
35

Vous pouvez utiliser Arrays.equals(..):

assertTrue(Arrays.equals(expectedResult, result));
Bozho
la source
14
Ce qui pue à ce sujet, c'est que vous n'obtenez AUCUNE donnée sur ce qui n'a pas fonctionné en cas d'échec.
mBria
8
Bien quand vous êtes sur une ancienne version junit (comme sur Android)
Zitrax
2
Si vous voulez voir quels octets ne correspondent pas, vous pouvez les convertir en chaîne: assertEquals (Arrays.toString (expectedResult), Arrays.toString (result));
Erdem
17

Je préfère convertir des tableaux en chaînes:

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

de cette façon, je peux voir clairement où se trouvent les mauvaises valeurs. Cela ne fonctionne efficacement que pour les tableaux de petite taille, mais j'utilise rarement des tableaux avec plus d'éléments que 7 dans mes tests unitaires.

Cette méthode fonctionne pour les types primitifs et pour les autres types lorsque la surcharge de toStringrenvoie toutes les informations essentielles.

csharpfolk
la source
4

En utilisant junit4 et Hamcrest, vous obtenez une méthode concise de comparaison de tableaux. Il donne également des détails sur l'emplacement de l'erreur dans la trace des échecs.

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

//...

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

Sortie de suivi des échecs:

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

Je sais que la question concerne JUnit4, mais si vous êtes bloqué sur JUnit3, vous pouvez créer une courte fonction utilitaire comme celle-ci:

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

Dans JUnit3, c'est mieux que de comparer directement les tableaux, car cela détaillera exactement quels éléments sont différents.

Haroldo_OK
la source