JUnit-Тестирование Пользовательских Аннотаций Проверки Java

#java #validation #junit #annotations #bean-validation

Вопрос:

Hei,

В настоящее время я работаю над пользовательскими аннотациями для проверки компонентов. Чтобы убедиться, что реализованная логика проверки работает должным образом, я хотел бы реализовать модульные тесты для этих аннотаций. К сожалению, я изо всех сил пытаюсь найти соответствующие руководства/руководства в Google.

Наиболее очевидным решением является создание некоторого класса, прикрепление к нему аннотации и использование ValidatorFactory для запуска проверки, как обычно. С помощью этого мы сможем увидеть, пришли ли ожидаемые результаты. Но этот подход не является реальным модульным тестом. Для выполнения теста выполняются различные другие части логики проверки компонентов.

Я действительно думаю, что было бы предпочтительнее протестировать валидаторы независимо, но я понятия не имею, как это сделать вручную. После создания экземпляра валидатора нам нужно будет передать аннотацию в его функцию инициализации. Но как я могу вручную создать этот экземпляр аннотации? Возможно ли это вообще?

Аннотация-Код:

 @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Constraint(validatedBy = { LongRangeValidator.class })
@Documented
public @interface LongRange {

    /**
     * Minimal valid value
     */
    long min() default 0;

    /**
     * Maximal valid value
     */
    long max() default Long.MAX_VALUE;

    String message() default "";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
    @Retention(RUNTIME)
    @Documented
    @interface List {
        LongRange[] value();
    }

}
 

Валидатор-Код:

 /**
 * Validator for @LongRange-Annotation
 */
public class LongRangeValidator implements ConstraintValidator<LongRange, Long> {

    private Long min;
    private Long max;

    @Override
    public void initialize(final LongRange constraintAnnotation) {
        min = constraintAnnotation.min();
        max = constraintAnnotation.max();
    }

    @Override
    public boolean isValid(final Long value, final ConstraintValidatorContext context) {
        if (value == null) {
            return true;
        }

        return min.compareTo(value) <= 0 amp;amp; max.compareTo(value) >= 0;
    }
}
 

Искренне,

Рабочий счет

Ответ №1:

Ладно, глупая проблема. Я не понял, как создать экземпляр интерфейса. Я решил это следующим образом:

В тестовом классе я добавил метод для создания экземпляра аннотации. Обратите внимание, что все интерфейсные методы, а также метод типа аннотации должны быть реализованы.

 private LongRange createLongRange(long min, long max) {
        return new LongRange() {
            @Override
            public long min() {
                return min;
            }

            @Override
            public long max() {
                return max;
            }

            @Override
            public String message() {
                return "MSG_1";
            }

            @Override
            public Class<?>[] groups() {
                return new Class[0];
            }

            @Override
            public Class<? extends Payload>[] payload() {
                return new Class[0];
            }

            @Override
            public Class<? extends Annotation> annotationType() {
                return LongRange.class;
            }
        };
    }

 

Используя этот метод, мы можем настроить валидатор для тестового набора со следующей логикой.

 private void setUp(long min, long max) {
        this.longRangeValidator = new LongRangeValidator();
        this.longRangeValidator.initialize(createLongRange(min, max));
    }
 

Благодаря этому я могу писать модульные тесты для своей аннотации.