#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));
}
Благодаря этому я могу писать модульные тесты для своей аннотации.