Tóm lại, hợp đồng hashCode, theo object.hashCode Java():Làm thế nào một đơn vị nên kiểm tra hợp đồng hashCode-equals?
- Mã băm không nên thay đổi trừ khi một cái gì đó ảnh hưởng đến equals() thay đổi
- equals() ngụ ý mã băm là = =
Giả sử quan tâm chủ yếu trong các đối tượng dữ liệu không thay đổi - thông tin của chúng không bao giờ thay đổi sau khi chúng được tạo, vì vậy # 1 được giả định giữ. Rằng # 2: vấn đề chỉ đơn giản là một trong những xác nhận rằng bằng hàm ngụ ý mã băm ==.
Rõ ràng, chúng tôi không thể kiểm tra mọi đối tượng dữ liệu có thể tưởng tượng trừ khi tập hợp đó nhỏ một cách đáng kể. Vì vậy, cách tốt nhất để viết một bài kiểm tra đơn vị có khả năng bắt các trường hợp phổ biến là gì?
Vì các trường hợp của lớp này là không thay đổi, có những cách hạn chế để xây dựng một đối tượng như vậy; kiểm tra đơn vị này nên bao gồm tất cả chúng nếu có thể. Trên đỉnh đầu của tôi, các điểm vào là các hàm tạo, deserialization và các hàm tạo của các lớp con (mà nên được giảm bớt cho vấn đề gọi hàm dựng).
[Tôi sẽ cố gắng trả lời câu hỏi của riêng mình thông qua nghiên cứu. Đầu vào từ stackoverflowers khác là một cơ chế an toàn hoan nghênh quá trình này.]
[Điều này có thể áp dụng đối với ngôn ngữ OO khác, vì vậy tôi thêm thẻ đó.]
Chỉ _using_ EqualsVerifier dạy tôi điều gì đó về Java! – David
Tôi có bị điên không? EqualsVerifier dường như không kiểm tra ngữ nghĩa Value Object ở tất cả! Nó cho rằng lớp của tôi thực hiện đúng bằng(), nhưng lớp của tôi sử dụng hành vi "==" mặc định. Làm sao có thể?! Tôi phải thiếu một cái gì đó đơn giản. –
Aha! Nếu tôi không ghi đè bằng(), thì EqualsVerifier giả định rằng mọi thứ đều ổn chứ !? Đó không phải là điều tôi mong đợi. Tôi sẽ mong đợi hành vi tương tự cho không trọng bằng() như cho trọng bằng() để làm chính xác cùng một điều super.equals(). Kỳ dị. –