嘿嘿,,
我目前正在为bean验证编写自定义注解。为了确保实现的验证逻辑按预期工作,我想为这些注解实现单元测试。遗憾的是,我在谷歌上苦苦寻找相关的指南/教程。
最明显的解决方案是创建一些类,在其上粘贴注解,并像往常一样使用validatorfactory启动验证。有了这个,我们就能看到预期的结果是否出现了。但这种方法不是真正的单元测试。bean验证逻辑的其他各个部分被运行以执行测试。
我确实认为最好单独测试验证器,但我不知道如何手动执行。在创建验证器示例之后,我们需要将注解传递给它的initialize函数。但是如何手动生成注解的这个示例呢?这可能吗?
注解代码:
@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 && max.compareTo(value) >= 0;
}
}
真诚地
工作账户
1条答案
按热度按时间gjmwrych1#
好吧,愚蠢的问题。我不知道如何示例化接口。我的解决办法如下:
在测试类中,我添加了一个创建注解示例的方法。请注意,所有接口方法以及annotationtype方法都必须实现。
使用此方法,我们可以使用以下逻辑为testcase设置验证器。
有了它,我就可以为注解编写单元测试了。