【问题标题】:JUnit-Testing Custom Validation Annotations JavaJUnit-Testing 自定义验证注解 Java
【发布时间】:2021-09-18 20:50:43
【问题描述】:

嘿,

我目前正在研究用于 bean 验证的自定义注释。为了确保实现的验证逻辑按预期工作,我想为这些注释实现单元测试。可悲的是,我正在努力在 Google 上找到相关的指南/教程。

最明显的解决方案是创建一些类,在其上粘贴注解,然后像往常一样使用 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;
    }
}

此致,

工作帐户

【问题讨论】:

    标签: java validation junit annotations bean-validation


    【解决方案1】:

    好的,愚蠢的问题。我没有得到如何实例化一个接口。我解决了如下:

    在测试类中,我添加了一个用于创建注释实例的方法。请注意,所有的 interface-Methods 以及 annotationType-Method 都必须实现。

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

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

    【讨论】:

      猜你喜欢
      • 2018-10-25
      • 2013-09-28
      • 2011-06-13
      • 1970-01-01
      • 2014-09-24
      • 1970-01-01
      • 2015-10-02
      • 2016-10-05
      • 1970-01-01
      相关资源
      最近更新 更多