В двух словах, договор Hashcode, согласно Object.hashCode Явы():Как один блок тестирует контракт hashCode-equals?
- хэш-код не должен измениться, если что-то влияет на равных() не изменяет
- равна() означает, хэш коды = =
Предположим, что мы заинтересованы прежде всего в неизменяемых объектах данных - их информация никогда не изменяется после их создания, поэтому предполагается, что # 1 удерживается. Это оставляет # 2: проблема заключается лишь в подтверждении того, что equals подразумевает хэш-код ==.
Очевидно, что мы не можем тестировать каждый мыслимый объект данных, если только этот набор тривиально мал. Итак, каков наилучший способ написать единичный тест, который, вероятно, поймает распространенные случаи?
Поскольку экземпляры этого класса являются неизменными, существуют ограниченные способы построения такого объекта; этот модульный тест должен охватывать все, если это возможно. В верхней части моей головы точки входа - это конструкторы, десериализация и конструкторы подклассов (которые должны быть приведены к проблеме вызова конструктора).
[Я попытаюсь ответить на свой вопрос с помощью исследования. Вклад других StackOverflowers механизм безопасности приветствовать этот процесс.]
[Это может быть применимо и к другим языкам ОО, поэтому я добавляю этот тег.]
Просто _using_ EqualsVerifier научил меня кое-что о Java! – David 2014-11-07 20:49:35
Я сошел с ума? EqualsVerifier, похоже, не проверял семантику Object объекта вообще! Он считает, что мой класс правильно реализует equals(), но мой класс использует поведение по умолчанию «==». Как это может быть?! Я должен пропустить что-то простое. – 2015-11-03 13:27:49