web-dev-qa-db-fra.com

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

Existe-t-il une méthode concise et intégrée pour effectuer des assertions d'égales sur deux tableaux de types similaires dans JUnit? Par défaut (du moins dans JUnit 4), il semble qu'une instance soit comparée 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?

136
mBria

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 de junit.framework.

260
Andy Thomas

Vous pouvez utiliser Arrays.equals(..):

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

Je préfère convertir les 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ù sont les mauvaises valeurs. Cela fonctionne efficacement uniquement 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 toString renvoie toutes les informations essentielles.

15
csharpfolk
10

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 défaillances.

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

//...

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

Sortie de trace d'échec:

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

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

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

Dans JUnit3, cela vaut mieux que de comparer directement les tableaux, car cela détaille exactement quels éléments sont différents.

2
Haroldo_OK