【问题标题】:How to properly use bean validation (JSR-303) with JUnit?如何在 JUnit 中正确使用 bean 验证 (JSR-303)?
【发布时间】:2012-11-20 16:17:38
【问题描述】:

我想在 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 的一个实例。

【问题讨论】:

    标签: jpa junit bean-validation


    【解决方案1】:

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

    JPA 提供者可以选择在创建 DDL 语句时考虑约束,例如 Hibernate ORM 应将列长度设置为 @Sizemax 属性。

    【讨论】:

    • “在创建 DDL 语句时可选择考虑约束”...真的,我认为这是强制性的。否则对我来说没有意义。
    • “Bean Validation 不考虑 JPA 实体(或默认列大小)”...嗯,好的,这意味着只会从数据库中检测到大小约束违规,而不是从验证器中检测到.
    猜你喜欢
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    • 2012-05-12
    • 2013-11-23
    • 2011-07-24
    • 2012-03-06
    • 2011-06-18
    • 2011-01-31
    相关资源
    最近更新 更多