【问题标题】:Custom ConstraintValidator unit test using Quarkus使用 Quarkus 的自定义 ConstraintValidator 单元测试
【发布时间】:2022-10-23 23:46:07
【问题描述】:

我需要对使用某些验证所需的@Inject 的自定义 ConstraintValidator 进行验证,但就像这个示例 https://quarkus.io/guides/validation

@ApplicationScoped
public class MyConstraintValidator implements ConstraintValidator<MyConstraint, String> {

    @Inject
    MyService service;

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (value == null) {
            return true;
        }

        return service.validate(value);
    }
}

当我运行应用程序时,我可以看到这是正确的验证,但我正在尝试使用 mockito 进行单元测试,我无法模拟对象始终为空。

在 quarkus 的示例中,单元测试仅用于集成。

这是我的实现

@ApplicationScoped
public class MyConstraintValidator implements ConstraintValidator<MyConstraint, String> {

    @Inject
    BookService service;

    @ConfigProperty(name = "my.property")
    int myLimit;

    public MyConstraintValidator(BookService service) {
        this.service = service;
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        System.out.println("myLimit property: " + myLimit);

        int limit = Integer.parseInt(value);
        if (limit < myLimit) {
            return service.validate(value);
        } else {
            context.disableDefaultConstraintViolation();
            context.buildConstraintViolationWithTemplate(NAME_EMPTY).addConstraintViolation();
            return false;
        }

    }
}

和单元测试

    @Test
    void testAmountValidationWithContext() {

        BookRequest bookRequest = new BookRequest();
        bookRequest.setTitle("my title");
        bookRequest.setAuthor("my Author");
        bookRequest.setPages(2L);
        bookRequest.setAmount("11");

        //when:
        myConstraintValidator = new MyConstraintValidator(service);
        Mockito.when(service.validate(anyString())).thenReturn(true);

        //then:
//        boolean result = myConstraintValidator.isValid("11", context);
        Set<ConstraintViolation<BookRequest>> violations = validator.validate(bookRequest);

        // verify that the context is called with the correct argument
        Mockito.verify(context).buildConstraintViolationWithTemplate(NAME_EMPTY);

    }

注释的行仅用于测试 isValid 方法并且工作正常。 但我需要测试@NotNull、@Pattern 的其他验证。 在此验证中, isValid() 也运行,这是我的问题,属性和 @Inject 为空。

我已经在互联网上看到了几个例子,但不起作用,几乎是春天,但我需要在 quarkus 上进行自定义验证。

如何使用 quarkus 实现自定义 ConstraintValidator 单元测试? 有没有人有这个工作的例子?

【问题讨论】:

    标签: constraints quarkus inject


    【解决方案1】:

    将代码从 field injection 更改为构造函数注入将使单元测试更加容易。

    @ApplicationScoped
    public class MyConstraintValidator implements ConstraintValidator<MyConstraint, String> {
    
    
        private final MyService service;
    
        public MyConstraintValidator(MyService service) {
           this.service = service;
        } 
    
        @Override
        public boolean isValid(String value, ConstraintValidatorContext context) 
        {
            if (value == null) {
                return true;
            }
    
            return service.validate(value);
        }
    }
    

    【讨论】:

    • 你好。这是一个可能的解决方案,但会破坏公司的指导代码。我们只使用@Inject。因此,如果我们将来使用其他注释,我们将把控制权传递给 quarkus。除此之外,我已经需要实现 ConfigProperty。
    【解决方案2】:

    用我的实现更新了描述。

    【讨论】:

      猜你喜欢
      • 2019-10-19
      • 2011-11-05
      • 2021-06-07
      • 2018-02-25
      • 2015-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多