junit测试自定义验证注解java

ss2ws0br  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(490)

嘿嘿,,
我目前正在为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;
    }
}

真诚地
工作账户

gjmwrych

gjmwrych1#

好吧,愚蠢的问题。我不知道如何示例化接口。我的解决办法如下:
在测试类中,我添加了一个创建注解示例的方法。请注意,所有接口方法以及annotationtype方法都必须实现。

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;
            }
        };
    }

使用此方法,我们可以使用以下逻辑为testcase设置验证器。

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

有了它,我就可以为注解编写单元测试了。

相关问题