JUnit 测试自定义验证注释 Java
JUnit-Testing Custom Validation Annotations Java
嘿,
我目前正在研究用于 bean 验证的自定义注释。为了确保实现的验证逻辑按预期工作,我想为这些注释实现单元测试。遗憾的是,我正在努力寻找 Google 上的相关 guides/tutorials。
最明显的解决方案是创建一些 class,在其上粘贴注释并像往常一样使用 validatorFactory 开始验证。有了这个,我们就能看到预期的结果是否出现了。但这种方法不是真正的单元测试。 bean 验证逻辑的其他各个部分正在 运行 进行测试。
我确实认为最好独立测试验证器,但我不知道如何手动执行此操作。创建验证器实例后,我们需要将注解传递给它的初始化函数。但是我怎样才能手动生成这个注释实例呢?这甚至可能吗?
注释-代码:
@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;
}
}
此致,
工作账户
好吧,愚蠢的问题。我不知道如何实例化接口。我是这样解决的:
在 Test-Class 中,我添加了一个创建 Annotation 实例的方法。请注意,必须实现所有接口方法以及注释类型方法。
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));
}
这样我就可以为我的注释编写单元测试了。
嘿,
我目前正在研究用于 bean 验证的自定义注释。为了确保实现的验证逻辑按预期工作,我想为这些注释实现单元测试。遗憾的是,我正在努力寻找 Google 上的相关 guides/tutorials。
最明显的解决方案是创建一些 class,在其上粘贴注释并像往常一样使用 validatorFactory 开始验证。有了这个,我们就能看到预期的结果是否出现了。但这种方法不是真正的单元测试。 bean 验证逻辑的其他各个部分正在 运行 进行测试。
我确实认为最好独立测试验证器,但我不知道如何手动执行此操作。创建验证器实例后,我们需要将注解传递给它的初始化函数。但是我怎样才能手动生成这个注释实例呢?这甚至可能吗?
注释-代码:
@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;
}
}
此致,
工作账户
好吧,愚蠢的问题。我不知道如何实例化接口。我是这样解决的:
在 Test-Class 中,我添加了一个创建 Annotation 实例的方法。请注意,必须实现所有接口方法以及注释类型方法。
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));
}
这样我就可以为我的注释编写单元测试了。