junit测试自定义验证注解java

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

嘿嘿,,
我目前正在为bean验证编写自定义注解。为了确保实现的验证逻辑按预期工作,我想为这些注解实现单元测试。遗憾的是,我在谷歌上苦苦寻找相关的指南/教程。
最明显的解决方案是创建一些类,在其上粘贴注解,并像往常一样使用validatorfactory启动验证。有了这个,我们就能看到预期的结果是否出现了。但这种方法不是真正的单元测试。bean验证逻辑的其他各个部分被运行以执行测试。
我确实认为最好单独测试验证器,但我不知道如何手动执行。在创建验证器示例之后,我们需要将注解传递给它的initialize函数。但是如何手动生成注解的这个示例呢?这可能吗?
注解代码:

  1. @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
  2. @Retention(RUNTIME)
  3. @Constraint(validatedBy = { LongRangeValidator.class })
  4. @Documented
  5. public @interface LongRange {
  6. /**
  7. * Minimal valid value
  8. */
  9. long min() default 0;
  10. /**
  11. * Maximal valid value
  12. */
  13. long max() default Long.MAX_VALUE;
  14. String message() default "";
  15. Class<?>[] groups() default {};
  16. Class<? extends Payload>[] payload() default {};
  17. @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
  18. @Retention(RUNTIME)
  19. @Documented
  20. @interface List {
  21. LongRange[] value();
  22. }
  23. }

验证程序代码:

  1. /**
  2. * Validator for @LongRange-Annotation
  3. */
  4. public class LongRangeValidator implements ConstraintValidator<LongRange, Long> {
  5. private Long min;
  6. private Long max;
  7. @Override
  8. public void initialize(final LongRange constraintAnnotation) {
  9. min = constraintAnnotation.min();
  10. max = constraintAnnotation.max();
  11. }
  12. @Override
  13. public boolean isValid(final Long value, final ConstraintValidatorContext context) {
  14. if (value == null) {
  15. return true;
  16. }
  17. return min.compareTo(value) <= 0 && max.compareTo(value) >= 0;
  18. }
  19. }

真诚地
工作账户

gjmwrych

gjmwrych1#

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

  1. private LongRange createLongRange(long min, long max) {
  2. return new LongRange() {
  3. @Override
  4. public long min() {
  5. return min;
  6. }
  7. @Override
  8. public long max() {
  9. return max;
  10. }
  11. @Override
  12. public String message() {
  13. return "MSG_1";
  14. }
  15. @Override
  16. public Class<?>[] groups() {
  17. return new Class[0];
  18. }
  19. @Override
  20. public Class<? extends Payload>[] payload() {
  21. return new Class[0];
  22. }
  23. @Override
  24. public Class<? extends Annotation> annotationType() {
  25. return LongRange.class;
  26. }
  27. };
  28. }

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

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

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

展开查看全部

相关问题