45 votes

test de junit non égal

J'essaie d'écrire un cas de test où mon scénario est que deux tableaux d'octets ne devraient pas être égaux.

Je peux le faire avec Junit ?

Ou dois-je utiliser quelque chose d'externe comme Hamcrest ? Je n'ai pas pu changer le code dans cette réponse pour faire le travail

Veuillez donner un échantillon.

53voto

Peter Lawrey Points 229686

Vous pouvez utiliser

assertFalse(Arrays.equals(array1, array2));

Si vous vouliez vérifier qu'ils étaient égaux, j'utiliserais ce qui suit à la place.

assertEquals(Arrays.toString(array1), Arrays.toString(array2));

car cela produit une sortie lisible indiquant ce qui était différent plutôt que simplement défaillant.

52voto

Sean Patrick Floyd Points 109428

Je préfère faire cela à la manière Hamcrest, ce qui est plus expressif :

Assert.assertThat(array1, IsNot.not(IsEqual.equalTo(array2)));

Ou la version courte avec des importations statiques :

assertThat(array1, not(equalTo(array2)));

(Heureusement, l'adaptateur IsEqual est assez intelligent pour comprendre les tableaux.)

Notez qu'une version limitée de Hamcrest fait partie de la distribution JUnit 4.x, vous n'avez donc pas besoin d'ajouter une bibliothèque externe.

16voto

pholser Points 1928

Les nouvelles versions de JUnit offrent org.junit.Assert.assertArrayEquals(byte[], byte[]), avec des surcharges pour d'autres types de tableaux. Les échecs montrent le premier index avec une non-correspondance et les différents éléments à cet index.

J'aime aussi assertEquals(Arrays.asList(expected), Arrays.asList(actual)). Le rendu avec Hamcrest mentionné ci-dessus est probablement le meilleur.

3voto

Manur Points 2652

Voici une alternative possible, qui a l'avantage d'utiliser le même code que assertArrayEquals() :

private void assertArrayNotEquals(byte[] expecteds, byte[] actuals) {
    try {
        assertArrayEquals(expecteds, actuals);
    } catch (AssertionError e) {
        return;
    }
    fail("The arrays are equal");
}

-1voto

Désolé, c'est un peu long, mais c'est facile à déboguer et vous pouvez le couper et le coller dans votre test unitaire.

private int span = 10;

private boolean equal(byte[] expected, byte[] got) {
    final boolean result;

    String message = null;
    int offset = -1;
    int length = -1;
    if(expected == null && got == null) {
        result = true;
    } else if(expected == null || got == null) {
        message = "One array is null: " + (expected == null ? "expected" : "got");
        result = false;
    } else if(expected.length != got.length) {
        message = "Lengths differ: expected = " + expected.length + ", got = " + got.length;
        result = false;
    } else {
        length = expected.length;
        for(int i = 0; i < length; i++) {
            if(expected[i] != got[i]) {
                offset = i;
                break;
            }
        }
        result = offset == -1;
        if(!result) {
            message = "Contents differ";
        }
    }

    if(!result) {
        System.err.println(message);
        if(offset >= 0) {
            hexDump("Expected: ", expected, offset, length);
            hexDump("     Got: ", got, offset, length);
        }
    }
    return result;
}

private void hexDump(String label, byte[] ba, int offset, int length) {
    System.err.print(label);
    if(ba == null) {
        System.err.println("<null>");
    } else if(ba.length == 0) {
        System.err.println("<zero-length-array>");
    } else {
        // <span> bytes either side

        final int from = Math.max(0, offset - span);
        final int to = Math.min(length, offset + span);
        if(from != 0) {
            System.err.print("(offset:" + from + ") ");
        }
        for(int i = from; i < to; i++) {
            System.err.printf("%02X ", new Byte(ba[i]));
        }
        System.err.println();
    }
}

@Test
public void testExample() {
    assertTrue(equal(new byte[] { 1, 2, 3 }, new byte[] { 1, 8, 3 }));
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X