2012-03-01 26 views
11

Khi sử dụng xác thực dựa trên chú thích cho bean mẫu, cách tốt nhất để kiểm tra đơn vị những hạt đó để đảm bảo rằng chú thích xác thực hợp lệ được chỉ định cho từng lĩnh vực?Các mẫu tốt cho mẫu thử nghiệm đơn vị đậu có xác nhận dựa trên chú thích trong Spring MVC

Ví dụ, nếu bạn có:

public class MyForm { 
    @NotNull 
    private String name; 
} 

cách tốt nhất để xác minh rằng @NotNull được áp dụng cho nó là gì?

Một cách rõ ràng là tạo trình xác thực, ném một giá trị rỗng vào nó và mong đợi nó không thành công. Nhưng theo quan điểm của tôi, đây không phải là cách tốt nhất vì bạn sẽ kiểm tra hành vi và thực hiện @NotNull bằng cách sử dụng điều đó thay vì tin tưởng vào khung công tác. Lý tưởng nhất là tôi muốn sử dụng phản chiếu hoặc tiện ích mang lại cho tôi khả năng xác nhận rằng xác thực @NotNull (và bất kỳ) khác được áp dụng cho một trường nhất định, thay vì phải gửi kết hợp khác nhau của các giá trị không xác thực .

Có cách nào thực hiện điều này một cách trang nhã hay tôi đang đi đúng hướng nói chung không?

Trả lời

4

Bạn cũng có thể viết các bài kiểm tra đơn vị cho Đậu của bạn được chú thích trong JSR303 bằng cách sử dụng nhà máy xác thực. Xem ví dụ: http://musingsofaprogrammingaddict.blogspot.com/2009/02/using-bean-validation-with-spring.html

+0

Cảm ơn bạn. Bài viết chính trong bài viết thực sự làm theo cách tôi muốn tránh. Tuy nhiên có một bình luận về bài viết đó (từ gunnar) đang làm nó theo cách tôi đã hy vọng - kiểm tra chú thích thay vì hành vi của chú thích. –

+2

Vui lòng thêm các phần bắt buộc của bài viết được liên kết như là một phần của câu trả lời của bạn để tránh mất thông tin nếu trang đó ngoại tuyến. – CSchulz

5

Hai điều bạn nên cân nhắc:

Không kiểm tra của bên thứ ba thư viện/framework.

Bạn nên dựa vào chúng, chúng được cho là đã được các nhà bảo trì của họ kiểm tra và sử dụng cộng đồng xung quanh. Bạn không thử nghiệm chúng, bạn thay vì đánh giá chúng. Để đảm bảo rằng chúng phù hợp với nhu cầu của bạn và giảm thiểu rủi ro.

Hành vi thử nghiệm là vấn đề thực sự!

Trong đại đa số các ứng dụng có rất ít chỗ cho thực UNIT thử nghiệm như là logic kinh doanh là một trong hai nhỏ đang lan rộng trên nhiều module của ứng dụng. Vì vậy, bạn nên xem xét tích hợp thử nghiệm với cùng một ưu tiên hơn so với thử nghiệm đơn vị. Và điều này dễ bị bắt hơn bằng cách sử dụng cách tiếp cận hành vi.

Vì vậy, để trả lời câu hỏi của bạn, bạn không nên thử Đơn vị thử nghiệm một mẫu bean nào cả. Nó chỉ là một vật thể vận chuyển. Những gì bạn nên kiểm tra là làm thế nào người nhận phản ứng với hình thức đó, và kiểm tra cả hai trường hợp bình thường và các trường hợp cạnh.

+2

Tôi đồng ý với không kiểm tra thư viện của bên thứ ba, tuy nhiên kiểm tra cấu hình của bạn cũng quan trọng như hành vi thử nghiệm. –

+0

Vâng, đó là một điểm tốt và tôi đồng ý với điều đó. Tuy nhiên tôi nghĩ (như frant.hartm nói) rằng có chỗ để kiểm tra cấu hình. Mọi thứ khác (tức là xác thực thực tế) không liên quan trực tiếp đến hạt và không được kiểm tra ở đây. –

+1

+1 cho 'Vì vậy, bạn nên xem xét thử nghiệm Tích hợp với cùng mức độ ưu tiên hơn so với Thử nghiệm đơn vị'. – artbristol

2

Chúng tôi kiểm tra các chú thích ở thuộc tính bean như một phần của thử nghiệm tích hợp giữa lớp trình bày của chúng tôi và thùng chứa lò xo.

Những gì chúng tôi làm là tạo giả MockPortletContext, DispatcherPortlet và MockRequests (các lớp này là một phần của thư viện thử nghiệm mùa xuân), điền các yêu cầu để chúng trông giống như biểu mẫu thực đã được gửi và sau đó gọi dispatcherPortlet. (chúng tôi có môi trường portlet nhưng nó không quan trọng)

Sau đó, bạn có thể kiểm tra xem chương trình phụ trợ của bạn có được gọi là thích hợp không hoặc phản hồi có chứa kết quả ràng buộc với lỗi xác thực dự kiến.

2

Bạn có thể kiểm tra dễ dàng.

Giả sử bạn đang sử dụng Trình xác thực Hibernate. Nhiều hay ít, nó phải là một cái gì đó như thế này

import javax.validation.ConstraintViolation; 
    import junit.framework.Assert; 
    import org.hibernate.validator.HibernateValidator; 
    import org.junit.Before; 
    import org.junit.Test; 
    import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; 

private LocalValidatorFactoryBean localValidatorFactory; 


@Before 
public void setup() { 
    localValidatorFactory = new LocalValidatorFactoryBean(); 
    localValidatorFactory.setProviderClass(HibernateValidator.class); 
    localValidatorFactory.afterPropertiesSet(); 
} 

    @Test 
    public void testNullValidationError() { 
     final MyForm myForm= new MyForm(); 
     myForm.setName(null); 
     Set<ConstraintViolation<MyForm >> constraintViolations =  localValidatorFactory.validate(myForm); 
     Assert.assertTrue("Your error message", constraintViolations.notNull == null); 
    } 
+0

Không, đây là những gì tôi chính xác muốn tránh trong thử nghiệm đơn vị cho đậu, như được giải thích trong bài gốc và theo dõi. –

Các vấn đề liên quan