当前位置 : 主页 > 网络安全 > 测试自动化 >

使用Mockito和Autowiring进行JSR 303 bean验证单元测试

来源:互联网 收集:自由互联 发布时间:2021-06-19
我想对我的验证器类进行junit测试,但我的验证器类有@autowired服务类.如何使用Mocikto注入这些依赖项? 我将使用下面的代码行调用验证器. SetConstraintViolationMyDomainPOJOObject constraintViolation
我想对我的验证器类进行junit测试,但我的验证器类有@autowired服务类.如何使用Mocikto注入这些依赖项?

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

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

问题是我自己没有实例化验证器类.它是JSR 303框架,它真正调用验证器的isValid方法().

另一件事是我不想使用spring Autowiring并使用@Mock和@InjectMock注释.

任何例子或想法?

我能够通过下面的代码行使其工作

@Override
public <T extends ConstraintValidator<?, ?>> T getInstance(Class<T> key) {
    if (key == com.nitin.validation.UpperCaseValidator.class) {
        return (T)upperCasevalidator;
    }
    //throw new IllegalArgumentException("expecting SomeValidationValidator!");
    return new ConstraintValidatorFactoryImpl().getInstance(key);
}
为此,我创建了自定义ConstraintValidatorFactory来提供我的自定义ConstraintValidator.

假设我们有以下内容:

> SomeValidation – Bean Validation约束注释
> SomeValidationValidator – 具有@Autowired依赖关系的Bean Validation约束验证器.它包含两个构造函数:default和需要依赖的构造函数

现在,您可以创建一个实现ConstraintValidatorFactory的测试SomeValidationValidatorTest,并使用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!");
}

有了这个你可以配置验证器:

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

上面的解决方案并不完美,但我认为它可以让您使用自定义ConstraintValidatorFactory来解决问题.

网友评论