43 votes

Comment puis-je faire un test unitaire pour hashCode() ?

Comment tester la fonction hashCode() dans les tests unitaires ?

 public int hashCode(){
    int result = 17 + hashDouble(re);
    result = 31 * result + hashDouble(im);
    return result;
}

90voto

duffymo Points 188155

Chaque fois que je remplace le code d'égalité et de hachage, j'écris des tests unitaires qui suivent les recommandations de Joshua Bloch dans le chapitre 3 sur "Java efficace". Je m'assure que le code d'égalité et de hachage est réflexif, symétrique et transitif. Je m'assure également que "pas égal" fonctionne correctement pour tous les membres de données.

Lorsque je vérifie l'appel à equals, je m'assure également que le hashCode se comporte comme il se doit. Comme ça:

 @Test
public void testEquals_Symmetric() {
    Person x = new Person("Foo Bar");  // equals and hashCode check name field value
    Person y = new Person("Foo Bar");
    Assert.assertTrue(x.equals(y) && y.equals(x));
    Assert.assertTrue(x.hashCode() == y.hashCode());
}

3voto

Peter Lawrey Points 229686

Créez de nombreux (millions d') objets aléatoires reproductibles et ajoutez tous les codes de hachage à un ensemble et vérifiez que vous obtenez presque et de nombreuses valeurs unqiue en tant que nombre d'identifiants générés. Pour les rendre reproductibles aléatoirement, utilisez une graine aléatoire fixe.

Vérifiez également que vous pouvez ajouter ces éléments à un HashSet et les retrouver. (En utilisant un objet différent avec les mêmes valeurs)

Assurez-vous que votre equals() correspond à votre comportement hashCode(). Je vérifierais également que vos champs sont tous définitifs.

3voto

Lukasz Points 9471

hashCode est remplacé afin de rendre les instances avec les mêmes champs identiques pour HashSet/HashMap etc. Ainsi, le test Junit doit affirmer que deux instances différentes avec les mêmes valeurs renvoient le même hashCode.

1voto

Bozho Points 273663

Je ne pense pas qu'il soit nécessaire de tester une unité de méthode de hachage. Surtout s'il est généré par votre IDE ou un HashCodeBuilder (apache commons)

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