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

这样我就可以为我的注释编写单元测试了。