【问题标题】:How to check if a constraint exists in a Java class?如何检查Java类中是否存在约束?
【发布时间】:2017-03-14 05:11:29
【问题描述】:

我已经为另一个使用 Hibernate 约束的类编写了一个测试类。在测试类中,我验证是否违反了约束。

但是如果程序员在重构原始类时忘记用约束对类进行注释怎么办。如何测试约束是否存在。


为了澄清,我有一个这样定义的类 -

Class User {
    @Email
    String email;

    @NumberFormat
    @Length(min = 8, max = 16)
    String phoneNumber;

    /*Getters and Setters Omitted*/
}

检查属性String email; 是否具有约束@Email

【问题讨论】:

  • 我不知道用 ORM 做这件事的方法,但你可以用普通的旧 JDBC 做。看到这个问题:stackoverflow.com/questions/11494549/…
  • 我没有访问任何外部数据。这些约束是 hibernate 中的注解和验证器
  • 哦,我明白了,您正在检查实体以确保 Hibernate 约束仍然存在。
  • 是的。我已经编写了违反约束的代码。但是,如果在重构时,程序员忘记更新约束怎么办?

标签: java hibernate unit-testing


【解决方案1】:

您尝试做的事情相当麻烦,而且它并不是真正的单元测试,因为 单元测试应该验证组件的特定行为。
在这里,您要验证类的结构。

如果您担心有人删除验证器注释,我认为您应该修改您的单元测试以检查是否未按预期为您正在验证的实体用户提供电子邮件,验证提供 具有良好消息/路径的 ConstraintViolation 实例。

【讨论】:

    【解决方案2】:

    您可以使用反射来做到这一点。这里有一个很好的教程:

    http://tutorials.jenkov.com/java-reflection/annotations.html

    基本上它会像这样工作:

    Class myEntity = MyEntity.class;
    Field someField = myEntity.getField("someField");
    Annotation[] annotations = someField.getAnnotations();
    
    for(Annotation annotation : annotations){
        if(annotation instanceof Length){
            Length length = (Length) annotation;
            System.out.println("value: " + length.value());
        }
    }
    

    我还没有测试过这段代码,但它应该足够你继续下去了。

    【讨论】:

    • 我得问问。是否有任何测试框架可以做到这一点?如assertThat(MyEntity.class).hasField(myEntity.getField("someField")).hasAnnotation("Length");
    • 我不确定,我以前从未尝试过这样做。我最近做了一些注释处理,所以我想到了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 2011-05-22
    • 2021-11-11
    • 1970-01-01
    • 2018-04-11
    相关资源
    最近更新 更多