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.
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.
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.
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.
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");
}
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 }));
}