如何在JUnit中正确使用bean验证(JSR-303)?

时间:2012-11-20 16:17:38

标签: jpa junit bean-validation

我想在JUnit测试中使用bean验证来验证实体。设置似乎正常,但测试不会失败。因此,看起来实体未经过正确验证。

以下是相关的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的实例。

1 个答案:

答案 0 :(得分:3)

Bean Validation不会考虑JPA实体(或默认列大小)。如果要使用Bean Validation验证长度,则必须添加@Size约束。

JPA提供程序可以选择在创建DDL语句时考虑约束,例如,Hibernate ORM应将列长度设置为max的{​​{1}}属性。