2012-05-17 51 views
8

Có công cụ/thư viện nào có thể tự động tạo các thử nghiệm cho hashcode của tôi và bằng các phương pháp xem xét các biến mẫu liên quan đến các phương thức này không?Tạo các bài kiểm tra đơn vị cho các phương thức hashcode, equals và toString

+0

Bạn đang sử dụng IDE nào? – buymypies

+0

Các thử nghiệm như vậy không có ý nghĩa quan trọng, nhưng chủ yếu là giới thiệu bảo trì. –

+3

@MPlatvoet Tôi không thực sự đồng ý với bạn, kiểm tra 'equals()' và 'hashcode()' có thể quan trọng đặc biệt nếu một số mã của bạn dựa nhiều vào đó ('HashMap', kiểm tra bình đẳng liên quan đến thừa kế) –

Trả lời

6

Ổi sử dụng this trình tạo thử nghiệm để kiểm tra equalshashCode.

3

toString() không nên có bất kỳ "hợp đồng" nào để tôn trọng, do đó, việc kiểm tra đơn vị sẽ rất lạ và không hữu ích.

Bạn có thể xem điều này project liên quan đến equals().

Ngoài ra còn có một JUnit Addon EqualsHashCodeTestCase


Cùng chủ đề:

+1

Tôi không thấy lý do tại sao toString không thể có thông số kỹ thuật, mặc dù tôi chưa bao giờ tự kiểm tra đơn vị. –

+0

Vâng, tôi đã không nói rằng nó không thể nhưng nó không nên.'toString()' là biểu diễn String của một đối tượng để người đọc có thể đọc được (xem javadoc for Object), vì vậy điều này nói rằng về cơ bản nó không nên làm bất cứ điều gì "cực đoan" (đó là biểu diễn của đối tượng, chứ không phải phương thức kinh doanh) và nó trả về một String được đọc bởi một con người, không được phân tích cú pháp. Từ đó thật dễ dàng để nói rằng 'toString' không nên được kiểm tra đơn vị (không phải là" không thể "hoặc" shan't "). –

+0

Có, nếu bạn đang kiểm tra chăn tất cả các lớp thì điều đó không có ý nghĩa. Do lưu ý rằng nó vẫn là hợp pháp đối với một lớp cụ thể làm cho một yêu cầu chặt chẽ hơn về 'toString'. Có khá nhiều ví dụ trong chính JSE ('StringWriter',' StringBuilder', 'URL', ...). –

-1

Bạn có thể sử dụng Apache EqualsBuilder và HashCodeBuilder để thực thi equals và hashCode và do đó giảm thiểu rủi ro không thực hiện đúng cách.

Kiểm tra bằng đơn giản, tạo hai trường hợp với giá trị mẫu giống nhau (theo đó bạn sẽ mong đợi bằng nhau) và gọi equals trên một đối tượng truyền tham số kia dưới dạng tham số và bạn sẽ mong đợi nó trả về true: D

+1

Câu hỏi là, làm thế nào bạn có thể kiểm tra rằng hợp đồng hashCode không bị hỏng. Làm thế nào nên thực hiện một thử nghiệm, mà kiểm tra sau hai điều: 1. Nếu bằng trả về true, sau đó hashCode phải trả về cùng một giá trị. 2. Nếu hashCode trả về các giá trị khác nhau, thì bằng nhau phải trả về false. – mentallurg

1

EqualsVerifier là một thư viện tuyệt vời. Tôi thường kết hợp nó với thư viện Reflections để tự động quét các lớp nhất định và kiểm tra hợp đồng cho tất cả chúng cùng một lúc:

@Test 
    public void validateEqualsHashCodeToString() { 
    final Reflections dtoClassesReflections = new Reflections(new ConfigurationBuilder() 
     .setUrls(ClasspathHelper.forPackage("my.base.package")) 
     .filterInputsBy(new FilterBuilder() 
     .include(".*Dto.*") // include all Dto classes 
     .exclude(".*Test.*")) // exclude classes from tests which will be scanned as well 
     .setScanners(new SubTypesScanner(false))); 

    final Set<Class<?>> allDtoClasses = dtoClassesReflections.getSubTypesOf(Object.class); 

    allDtoClasses.forEach(dtoClass -> { 
     logger.info("equals/hashCode tester testing: " + dtoClass); 
     EqualsVerifier.forClass(dtoClass).verify(); 

     try { 
     dtoClass.getDeclaredMethod("toString"); 
     } catch (NoSuchMethodException e) { 
     fail(dtoClass + " does not override toString() method"); 
     } 
    }); 
    } 
Các vấn đề liên quan