Comparación de matrices en aserciones JUnit, ¿forma incorporada concisa?

159

¿Hay una forma concisa e integrada de hacer afirmaciones iguales en dos matrices de tipo similar en JUnit? Por defecto (al menos en JUnit 4) parece hacer una comparación de instancia en el objeto de matriz en sí.

EG, no funciona:

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

Por supuesto, puedo hacerlo manualmente con:

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

..¿Pero hay una manera mejor?

mBria
fuente

Respuestas:

298

Utilice el método org.junit.AssertassertArrayEquals :

import org.junit.Assert;
...

Assert.assertArrayEquals( expectedResult, result );

Si este método no está disponible, es posible que haya importado accidentalmente la clase Assert de junit.framework.

Andy Thomas
fuente
pero todo lo que obtienes cuando falla por una longitud diferente es java.lang.AssertionError: array lengths differed, expected.length=6 actual.length=7. Como la mayoría de los mensajes de error de JUnit no es tan útil ... Aconsejo usar algún marco de afirmación
usuario1075613,
1
@ user1075613 - Lo encuentro útil. Afirmamos que las matrices eran iguales, no lo son, y nos dan una indicación de por qué. A partir de ahí, podemos establecer un punto de interrupción y examinar las matrices en detalle.
Andy Thomas
1
bien, es un poco útil. Sin embargo, como lo señala, en el instante en que recibe este mensaje, se pregunta "¿por qué no tiene la misma longitud?" entonces quieres verificar el contenido. ¿Por qué perder tiempo con un depurador cuando un buen mensaje de error podría decirlo directamente? (seguro que todavía necesita el depurador a veces pero la mayoría de las veces no)
user1075613
Puede enviar problemas al sistema de seguimiento de problemas de JUnit . Sin embargo, tenga en cuenta que 1) fallar rápidamente, en O (1), puede ser una ventaja, 2) la salida de falla de aserción no debe ser O (n). El sistema de seguimiento de problemas JUnit es un mejor foro para mayor discusión.
Andy Thomas
1
@anddero - Assert.assertFalse( Arrays.equals( expectedResult, result )).
Andy Thomas
35

Puedes usar Arrays.equals(..):

assertTrue(Arrays.equals(expectedResult, result));
Bozho
fuente
14
Sin embargo, lo que apesta de eso es que NO obtienes datos sobre lo que salió mal cuando falla.
mBria
8
Agradable cuando estás en una versión anterior de junit (como en Android)
Zitrax
2
Si desea ver qué bytes no coinciden, puede convertirlos en una cadena: afirmarEquals (Arrays.toString (pectedResult), Arrays.toString (resultado));
Erdem
17

Prefiero convertir matrices en cadenas:

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

De esta manera puedo ver claramente dónde están los valores incorrectos. Esto funciona de manera efectiva solo para matrices de pequeño tamaño, pero rara vez uso matrices con más elementos que 7 en mis pruebas unitarias.

Este método funciona para tipos primitivos y para otros tipos cuando la sobrecarga de toStringretorna toda la información esencial.

csharpfolk
fuente
4

Usando junit4 y Hamcrest obtienes un método conciso para comparar matrices. También da detalles de dónde está el error en la traza de falla.

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

//...

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

Salida de seguimiento de falla:

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

Sé que la pregunta es para JUnit4, pero si está atascado en JUnit3, podría crear una función de utilidad corta como esa:

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

En JUnit3, esto es mejor que comparar directamente las matrices, ya que detallará exactamente qué elementos son diferentes.

Haroldo_OK
fuente