objetos metodo example comparar java unit-testing equals hashcode compareto

java - metodo - Técnica para verificar automáticamente la consistencia de equals, hashCode, y compareTo?



metodo hash java (5)

Soy muy consciente de las necesidades contractuales para asegurarme de que hashCode sea ​​consistente con equals y que sea equals con compareTo . Sin embargo, esto es a menudo violado en la práctica . ¿Existen herramientas, técnicas o bibliotecas que puedan probar esta consistencia automáticamente?

Sospecho que, lamentablemente, la respuesta es "no", pero sería útil poder realizar una prueba de unidad para este tipo de cosas que podrían utilizar una biblioteca o un marco de trabajo en lugar de tener que escribir una prueba personalizada a mano para Cada caso donde sea importante.

En caso de que no quede claro a qué me refiero con coherencia, para hashCode y equals me refiero a lo siguiente:

Si dos objetos son iguales según el método equals (Objeto), entonces llamar al método hashCode en cada uno de los dos objetos debe producir el mismo resultado entero.

Para equals y compareTo me refiero a lo siguiente:

El orden natural para una clase C se dice que es consistente con igual si y solo si e1.compareTo (e2) == 0 tiene el mismo valor booleano que e1.equals (e2) para cada e1 y e2 de la clase C.


Hay una herramienta muy interesante llamada Korat que puede hacer búsquedas exhaustivas para verificar la corrección de las clases de Java para casos pequeños. En realidad, examina el código que se ejecuta para generar todos los diferentes casos de prueba de un tamaño determinado entre los que el programa puede distinguir. No sé cuán útil es en casos grandes, pero para muchos programas se puede usar para verificar automáticamente si casos como este funcionan correctamente.

¡Espero que esto ayude!


He escrito algunos métodos de utilidad para ayudar a las pruebas unitarias de hashCode y métodos iguales:

http://softsmithy.sourceforge.net/devlib/docs/api/org/softsmithy/devlib/junit/Tests.html

La biblioteca es de código abierto y se puede descargar desde aquí: http://sourceforge.net/projects/softsmithy/files/softsmithy-devlib/v0.1/

o con Maven:

<dependency> <groupId>org.softsmithy.devlib</groupId> <artifactId>devlib-core</artifactId> <version>0.1</version> <scope>test</scope> </dependency>


Recientemente he usado meanbean (http://meanbean.sourceforge.net/) para probar automáticamente una clase para los contratos equals () y hashCode () (más los pares setter / getter).

"Mean Bean:

1. Comprueba que los pares de métodos getter y setter de un JavaBean / POJO funcionan correctamente. 2. Verifica que los métodos equals y hashCode de una clase cumplan con el contrato Equals y el contrato HashCode respectivamente. 3. Verifica la importancia de la propiedad en la igualdad de objetos ".

Todavía tengo muchas preguntas específicas para meanbean: si verifica la consistencia de equals () y hashCode (). Además, no he tratado de derrotarlo. Creo que no tiene soporte para compareTo (). Y no he probado alternativas. Interesado en la experiencia de otros.


Si está utilizando JUnit, el paquete de extensiones tiene el EqualsHashCodeTestCase , que prueba completamente a ambos iguales y hashCode para todo lo descrito en la especificación de Java (reflexivo, transitivo, simétrico, etc.). Todo lo que tiene que hacer es proporcionar un objeto igual y no igual para que la clase principal lo use para la verificación.

Dado que el método CompareTo es parte de la interfaz Comparable, en realidad se divide en otro caso de prueba: ComparabilityTestCase . Esto requiere tres objetos: uno de menor valor, igual valor y mayor valor. Anula estos y la clase padre se hará cargo del resto.


Las pruebas de Guava tienen una utilidad llamada EqualsTester que utilizamos como parte cotidiana de nuestras pruebas unitarias para probar equals y hashCode . Su uso parece

new EqualsTester() .addEqualityGroup("hello", "h" + "ello") .addEqualityGroup("world", "wor" + "ld") .addEqualityGroup(2, 1 + 1) .testEquals();

que comprueba que todos los valores en el mismo grupo son iguales y tienen los mismos códigos hash, que los diferentes grupos no son iguales y que todos los otros invariantes están satisfechos. Usted podría usarlo usted mismo, o simplemente tomar prestadas sus ideas.

Me sorprendería enormemente si fuera posible probar sin generar o especificar explícitamente los valores de prueba, solo porque parece muy probable que sea equivalente al problema de detención.