验证javax.persistance注释?

Sle*_*led 4 java validation unit-testing hibernate mocking

我想以编程方式检查对象是否满足其javax.persistance注释所指定的内容.我正在为Hibernate DAO 创建一个的单元测试用途.然而,有一个缺陷没有被单元测试捕获,因为假的没有检查@Column注释中字段的长度,Hibernate做了.

显然,我可以添加代码来手动检查这些字段,但我宁愿使用一种方法来检查所有这些字段,因此如果值发生变化,它将是最新的.我尝试使用javax.validation.ValidatorApache的Bean验证,但验证没有发现问题.是否有一个函数可以在不调用完整的Hibernate会话的情况下进行测试?

为了清楚起见,我感兴趣的是模拟Hibernate的"类型检查"而不是bean验证本身,这只是我试图用来执行检查的东西.

import javax.validation.Validation;
@Test( expected = IllegalArgumentException.class )
public shouldComplainBecauseOfNullsOrLength(){
    AclPermission acl = new AclPermission();
    acl.setTarget( "I   am    way    tooo     long   for     this   field   .    " );

    if(  !  Validation.buildDefaultValidatorFactory().getValidator().validate( acl ).isEmpty()  )
        throw new IllegalArgumentException();
    fail( "Should have had a problem with null values." );
}
Run Code Online (Sandbox Code Playgroud)

目前使用此代码,我宁愿用更强大的东西替换.

        for(  String fieldName :   new String[]{ "target", "action", "recipient" }  ){
            final Field field = AclPermission.class.getDeclaredField( fieldName );
            field.setAccessible( true );

            final Column fieldConstraints  = field.getAnnotation( Column.class );

            final String fieldValue = (String) field.get( acl );
            if( ! fieldConstraints.nullable() && fieldValue == null  )
                throw new NullPointerException( fieldName + " is null." );
            else if( fieldValue != null && fieldValue.length() > fieldConstraints.length() )
                throw new IllegalArgumentException( fieldName + " is too long " + fieldValue.length() + "/" + fieldConstraints.length() );

        } 
Run Code Online (Sandbox Code Playgroud)

这是我要验证的类:

public class AclPermission{
    @Id
    @Column(name="ID", nullable=false)
    @GeneratedValue(generator="system-uuid")
    @GenericGenerator(name="system-uuid", strategy = "uuid")
    private String id;

    @Column(name="TARGET", nullable=false, length=6)
    private String target;

    @Column(name="ACTION", nullable=false, length=10)
    private String action;

    @Column(name="RECIPIENT", nullable=false, length=6)
    private String recipient;

    //... getters and setters go here
}
Run Code Online (Sandbox Code Playgroud)

Aff*_*ffe 6

属性nullablelength@Column注释是架构生成.它们用于告诉持久性提供程序如何设置数据库.它们与运行时验证无关.如果要使用JSR-303验证器,则需要使用JSR-303注释.

@Column(name="TARGET", nullable=false, length=6)
@javax.validation.constraints.NotNull
@javax.validation.constraints.Size(max=6)
private String target;
Run Code Online (Sandbox Code Playgroud)

等等