Comparando matrizes em asserções JUnit, de maneira concisa e integrada?


159

Existe uma maneira concisa e integrada de fazer asserções iguais em duas matrizes do mesmo tipo no JUnit? Por padrão (pelo menos no JUnit 4), parece fazer uma comparação de instância no próprio objeto da matriz.

EG, não funciona:

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

Claro, eu posso fazer isso manualmente com:

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

..mas existe uma maneira melhor?

Respostas:


297

Use o método org.junit.AssertassertArrayEquals :

import org.junit.Assert;
...

Assert.assertArrayEquals( expectedResult, result );

Se esse método não estiver disponível, você poderá ter importado acidentalmente a classe Assert junit.framework.


mas tudo o que você obtém quando falha por um comprimento diferente é java.lang.AssertionError: array lengths differed, expected.length=6 actual.length=7. Como a maioria das mensagens de falha JUnit não é tão útil ... Eu aconselho usando algum quadro afirmação
user1075613

1
@ user1075613 - Acho útil. Afirmamos que as matrizes eram iguais, não são e recebemos uma indicação do motivo. A partir daí, podemos definir um ponto de interrupção e examinar as matrizes em detalhes.
Andy Thomas

1
certo, é - um pouco - útil. No entanto, como você aponta, no instante em que você recebe essa mensagem, você se pergunta "por que não tem o mesmo comprimento?" então você deseja verificar o conteúdo. Por que perder tempo com um depurador quando uma boa mensagem de erro pode ser contada diretamente? (certeza de que ainda precisa do depurador às vezes, mas na maioria das vezes você não)
user1075613

Você pode enviar problemas ao sistema de rastreamento de problemas da JUnit . Porém, lembre-se de que 1) falhar rapidamente, em O (1), pode ser uma vantagem; 2) a saída da falha de asserção não deve ser O (n). O sistema de rastreamento de problemas da JUnit é um fórum melhor para discussões adicionais.
Andy Thomas

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

35

Você pode usar Arrays.equals(..):

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

14
O que fede a isso é que você NÃO obtém dados sobre o que deu errado quando falha.
MBria

8
Bom quando você estiver em uma versão mais antiga junit (como no Android)
Zitrax

2
Se você deseja ver quais bytes não correspondem, pode convertê-los em string: assertEquals (Arrays.toString (pectedResult), Arrays.toString (result));
Erdem

17

Eu prefiro converter matrizes em strings:

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

Desta forma, posso ver claramente onde estão os valores errados. Isso funciona efetivamente apenas para matrizes de tamanho pequeno, mas raramente uso matrizes com mais itens que 7 em meus testes de unidade.

Este método funciona para tipos primitivos e para outros tipos quando a sobrecarga toStringretorna todas as informações essenciais.



4

Usando junit4 e Hamcrest, você obtém um método conciso de comparação de matrizes. Ele também fornece detalhes de onde o erro está no rastreamento de falha.

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

//...

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

Saída de rastreamento de falha:

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

2

Eu sei que a pergunta é para o JUnit4, mas se você estiver preso no JUnit3, poderá criar uma função de utilitário curta assim:

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

No JUnit3, isso é melhor do que comparar diretamente as matrizes, pois detalha exatamente quais elementos são diferentes.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.