Sle*_*led 4 java validation unit-testing hibernate mocking
我想以编程方式检查对象是否满足其javax.persistance注释所指定的内容.我正在为Hibernate DAO 创建一个假的单元测试用途.然而,有一个缺陷没有被单元测试捕获,因为假的没有检查@Column注释中字段的长度,Hibernate做了.
显然,我可以添加代码来手动检查这些字段,但我宁愿使用一种方法来检查所有这些字段,因此如果值发生变化,它将是最新的.我尝试使用javax.validation.Validator与Apache的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)
属性nullable和length对@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)
等等
| 归档时间: |
|
| 查看次数: |
1838 次 |
| 最近记录: |