2012-11-20 26 views
2

我想在JUnit測試中驗證使用bean驗證的實體。設置似乎好,但測試不會因爲它應該失敗。因此,它看起來像實體未被正確驗證。如何在JUnit中正確使用bean驗證(JSR-303)?

這裏的相關JPA註釋:

@Column(name = "mobile_numbers", table = STN) 
private String smsRecipientMobileNumbers; 

列得到的255個字符(在數據庫中正確應用)默認大小。

這裏的測試:

final Collection<String> recipients = new ArrayList<String>(2000); 
    for (int i = 0; i < 2000; i++) { 
    recipients.add("some mobile number"); 
    } 
    objectUnderTest.setSmsRecipients(recipients); 

    ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 
    Validator validator = factory.getValidator(); 
    violations = validator.validate(objectUnderTest, Default.class); 
    assertThat(violations, is(empty())); 
} 

我希望它失敗,因爲smsRecipientMobileNumbers遠遠超出255個字符,但它傳遞。

如果我明確地在測試失敗的實體應用尺寸約束:

@Column(name = "mobile_numbers", table = STN) 
@Size(max = 255) 
private String smsRecipientMobileNumbers; 

什麼我錯在這裏做什麼?顯然,所選提供者必須能夠正確解釋JPA註釋。驗證器是org.hibernate.validator.engine.ValidatorImpl的一個實例。

回答

3

Bean驗證不考慮JPA實體(或默認列大小)。如果要使用Bean驗證驗證長度,則必須添加@Size約束。

在創建DDL語句時,JPA提供者可以選擇考慮約束條件,例如Hibernate ORM應該將列長度設置爲@Sizemax屬性。

+0

「可選地考慮創建DDL語句時的約束條件」......真的,我認爲這是強制性的。否則對我沒有意義。 –

+0

「Bean驗證不考慮JPA實體(或默認列大小)」......嗯,好吧,這意味着只有數據庫才能檢測到大小約束違規,而不是驗證器。 –