web-dev-qa-db-fra.com

tableaux junit pas test égal

J'essaie d'écrire un scénario de test où mon scénario est que deux tableaux byte devraient être non égaux.

Puis-je faire cela avec Junit?

Ou dois-je utiliser quelque chose d'extérieur comme Hamcrest? Je ne pouvais pas changer le code dans cette réponse pour faire le travail

S'il vous plaît donner un échantillon.

31
Sam

Je préfère faire ceci de la manière Hamcrest, qui est plus expressive:

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

Ou la version courte avec les importations statiques:

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

(Le correcteur IsEqual est assez intelligent pour comprendre les tableaux, heureusement.)

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.

40
Sean Patrick Floyd

Vous pouvez utiliser

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

Si vous vouliez vérifier qu'ils étaient égaux, j'utiliserais plutôt le suivant.

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

car cela produit une sortie lisible sur ce qui était différent plutôt que simplement échouer.

41
Peter Lawrey

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

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

13
pholser

Voici une alternative possible, qui présente 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");
}
2
Manur

Désolé, cela est un peu long, mais il est facile de déboguer et vous pouvez le copier-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 }));
}
0
Keith Whittingham