Проверять аннотации javax.persistance? - PullRequest
4 голосов
/ 10 мая 2011

Я хотел бы программно проверить, выполняет ли объект то, что указано в его аннотациях 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
}

1 Ответ

6 голосов
/ 10 мая 2011

Атрибуты 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;

и т. Д.

...