Validation JSR303Bean验证单元测试与Mockito和Autowiring

Validation JSR303Bean验证单元测试与Mockito和Autowiring,validation,unit-testing,mockito,junit4,Validation,Unit Testing,Mockito,Junit4,我想junit测试我的验证器类,但我的验证器类有@autowired服务类。如何使用Mocikto注入这些依赖项 我将使用下面的代码行调用验证器 Set<ConstraintViolation<MyDomainPOJOObject>> constraintViolationsFromJavaRules = validator.validate(myDomainPOJOObject, Default.class); 为了实现这一点,我创建了自定义ConstraintVal

我想junit测试我的验证器类,但我的验证器类有@autowired服务类。如何使用Mocikto注入这些依赖项

我将使用下面的代码行调用验证器

Set<ConstraintViolation<MyDomainPOJOObject>> constraintViolationsFromJavaRules = validator.validate(myDomainPOJOObject, Default.class);

为了实现这一点,我创建了自定义ConstraintValidator工厂来提供自定义ConstraintValidator

假设我们有以下情况:

  • SomeValidation-Bean验证约束注释
  • SomeValidationValidator-具有@Autowired依赖项的Bean验证约束验证器。它包含两个构造函数:默认构造函数和接受依赖项的构造函数
  • 现在,您可以创建一个测试SomeValidationValidatorTest,该测试实现ConstraintValidatorFactory,并与MockitoJUnitRunner.class一起运行:

    @RunWith(MockitoJUnitRunner.class)
    public class SomeValidationValidatorTest implements ConstraintValidatorFactory {
        @Mock
        private MyDependency myDependencyMock;
    }
    
    您必须从ConstraintValidatorFactory实现getInstance方法:

    @Override
    public <T extends ConstraintValidator<?, ?>> T getInstance(Class<T> key) {
        if (key == SomeValidationValidator.class) {
            return (T) new SomeValidationValidator(myDependencyMock);
        }
        throw new IllegalArgumentException("expecting SomeValidationValidator!");
    }
    
    @覆盖
    public config=Validation.byDefaultProvider().configure();
    config.constraintValidatorFactory(此);
    ValidatorFactory=config.buildValidatorFactory();
    validator=factory.getValidator();
    }
    
    最后,创建一些测试:

    @Test
    public void someTest1() {
        // arrange
        Bean bean = new Bean();
        Mockito.when(myDependencyMock.isValid(null)).thenReturn(true);
        // act
        Set<ConstraintViolation<Bean>> constraintViolations = validator.validate(bean);
        // assert
        Assert.assertTrue(constraintViolations.isEmpty());
        Mockito.verify(myDependencyMock).isValid(null);
    }
    
    @测试
    public void someTest1(){
    //安排
    Bean=新Bean();
    Mockito.when(myDependencyMock.isValid(null)).thenReturn(true);
    //表演
    Set constraintViolations=validator.validate(bean);
    //断言
    Assert.assertTrue(constraintViolations.isEmpty());
    Mockito.verify(myDependencyMock).isValid(null);
    }
    

    上述解决方案并不完美,但我认为它提供了使用custom Constraint Validator Factory解决问题的想法。

    谢谢,只有此解决方案对我有所帮助
    @Before
    public void setUp() throws Exception {
    
        // see https://docs.jboss.org/hibernate/validator/5.2/reference/en-US/html/chapter-bootstrapping.html#_constraintvalidatorfactory
        Configuration<?> config = Validation.byDefaultProvider().configure();
        config.constraintValidatorFactory(this);
    
        ValidatorFactory factory = config.buildValidatorFactory();
    
        validator = factory.getValidator();
    }
    
    @Test
    public void someTest1() {
        // arrange
        Bean bean = new Bean();
        Mockito.when(myDependencyMock.isValid(null)).thenReturn(true);
        // act
        Set<ConstraintViolation<Bean>> constraintViolations = validator.validate(bean);
        // assert
        Assert.assertTrue(constraintViolations.isEmpty());
        Mockito.verify(myDependencyMock).isValid(null);
    }