Dưới đây là yêu cầu của tôi cho kiểm tra đơn vị:Đơn vị kiểm tra - thực hiện bình đẳng chỉ để tạo điều kiện thử nghiệm
- Tôi muốn đơn vị kiểm tra lớp học sản xuất của tôi
- Tôi muốn tách mã kiểm tra và mã sản xuất ngoài như vậy tôi chỉ có thể phát hành mã sản xuất
Điều này có vẻ như yêu cầu hợp lý. Tuy nhiên, một vấn đề luôn nảy sinh khi tôi cần sử dụng các phương thức như assertEquals
trên các đối tượng vì chúng đòi hỏi phương thức equals
bị ghi đè. Phương pháp equals
sẽ phải được triển khai trong các lớp sản xuất nhưng thực tế chỉ được sử dụng để thử nghiệm. Điều này trở nên tồi tệ hơn khi thực hành mã hóa tốt quy định rằng nếu equals
bị ghi đè, thì cũng cần thực hiện hashCode
dẫn đến mã sản xuất không sử dụng nhiều hơn làm xáo trộn các lớp sản xuất.
Đây là một ví dụ đơn giản với một mô hình User
(IntelliJ autoimplemented equals
và hashCode
)
public class User
{
public long id;
public long companyId;
public String name;
public String email;
public long version;
@Override
public boolean equals(Object o)
{
if(this == o) return true;
if(o == null || getClass() != o.getClass()) return false;
User user = (User) o;
if(companyId != user.companyId) return false;
if(id != user.id) return false;
if(version != user.version) return false;
if(!email.equals(user.email)) return false;
if(!name.equals(user.name)) return false;
return true;
}
@Override
public int hashCode()
{
int result = (int) (id^(id >>> 32));
result = 31 * result + (int) (companyId^(companyId >>> 32));
result = 31 * result + name.hashCode();
result = 31 * result + email.hashCode();
result = 31 * result + (int) (version^(version >>> 32));
return result;
}
}
Vì nó có thể được nhìn thấy, equals
và hashCode
chiếm rất nhiều không gian và rối cái class.
Một giải pháp cho vấn đề có thể là tạo một lớp, UserTester
, có thể sử dụng phương thức assertUserEquals
thay vì ví dụ. JUnit's assertEquals
.
Một giải pháp khác có thể là tạo một UserComparator
. Tuy nhiên, có vẻ như JUnit không có bất kỳ số assertEquals
nào mất Comparator
.
Thực tiễn tốt nhất về điểm này là gì?
Chỉ cần kiểm tra tài liệu của họ. Có vẻ như bạn nên sử dụng 'assertReflectionEquals' thay vì' assertEquals'. Có vẻ như đó là giải pháp cho vấn đề của tôi. – foens
Tệ của tôi, cảm ơn vì đã chú ý – Jk1
Ehh - Chỉ tìm thấy một vấn đề nhỏ mà tôi chưa trình bày trong câu hỏi của mình. Điều gì về việc sử dụng các khuôn khổ như [mockito] (https://code.google.com/p/mockito/) để chế nhạo? Khi sử dụng các phương thức như 'verify (userDeleter) .delete (user)', nó cũng sử dụng 'equals' để kiểm tra các đối số. Bạn có biết giải pháp nào cho vấn đề đó không? – foens