En pocas palabras, el contrato hashCode, según Object.hashCode de Java():¿Cómo debe una unidad probar el contrato hashCode-igual?
- El código hash no debería cambiar a menos que algo que afecta a los iguales() cambia
- iguales() implica códigos hash son = =
Asumamos interés principalmente en objetos de datos inmutables: su información nunca cambia una vez que se han construido, por lo que se supone que el valor n. ° 1 es válido. Eso deja el # 2: el problema es simplemente uno de confirmar que igual implica un código hash ==.
Obviamente, no podemos probar todos los objetos de datos concebibles a menos que ese conjunto sea trivialmente pequeño. Entonces, ¿cuál es la mejor manera de escribir una prueba unitaria que probablemente atrape los casos comunes?
Dado que las instancias de esta clase son inmutables, existen formas limitadas de construir dicho objeto; esta prueba unitaria debe cubrir todos ellos si es posible. Fuera de mi cabeza, los puntos de entrada son los constructores, la deserialización y los constructores de subclases (que deberían poder reducirse al problema de llamada del constructor).
[Voy a tratar de responder mi propia pregunta a través de la investigación. Aportaciones de otros StackOverflowers es un mecanismo de seguridad bienvenidos a este proceso.]
[Esto podría ser aplicable a otros lenguajes orientados a objetos, así que estoy añadiendo esa etiqueta.]
Sólo _using_ EqualsVerifier me enseñó algo sobre Java! – David
¿Estoy loco? ¡EqualsVerifier no pareció verificar la semántica del Value Object en absoluto! Cree que mi clase implementa correctamente equals(), pero mi clase usa el comportamiento predeterminado "==". ¡¿Cómo puede ser esto?! Debo extrañar algo simple. –
Aha! Si no anulo equals(), entonces EqualsVerifier asume que todo está bien? Eso no es lo que esperaría. Esperaría el mismo comportamiento para no anular equals() como para anular equals() para hacer exactamente lo mismo que super.equals(). Extraño. –