Я хотел бы программно проверить, выполняет ли объект то, что указано в его аннотациях javax.persistance. Я создаю фальшивку для Hibernate DAO для модульного тестирования. Тем не менее, был обнаружен дефект, который не был обнаружен модульными тестами, поскольку фальшивка не проверяла длину поля в аннотации @Column, что сделал Hibernate.
Очевидно, я мог бы добавить код для проверки этих полей вручную, но я бы предпочел использовать метод, который проверял бы все из них и, таким образом, был бы актуален в случае изменения значения. Я попытался использовать javax.validation.Validator
с Apache Bean Validation , но валидатор не нашел проблем. Есть ли функция, которая будет тестировать, не вызывая полноценный сеанс 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." );
}
В настоящее время используется этот код, который я бы предпочел заменить на более надежный.
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() );
}
Это класс, который я пытаюсь проверить:
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
}