使用 Mockito 和自动装配进行 JSR 303 bean 验证单元测试 [英] JSR 303 bean validation unit testing with Mockito and Autowiring

查看:26
本文介绍了使用 Mockito 和自动装配进行 JSR 303 bean 验证单元测试的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I want to junit test my validator class but my validator class has @autowired service classes. How do I inject these dependencies using Mocikto?

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

I am going to call the validator using below line of code.

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

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

Problem is I am not instantiating validator class myself. It's the JSR 303 framework which truely calls the validator's isValid method().

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

Another thing is I don't want to use spring Autowiring and use the @Mock and @InjectMock annotations.

有什么例子或想法吗?

我可以通过下面的代码行来让它工作

I was able to get it working by having below line of code

@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.

To achieve this I created custom ConstraintValidatorFactory to provide my custom ConstraintValidator.

假设我们有以下内容:

  1. SomeValidation - Bean Validation 约束注解
  2. SomeValidationValidator - 具有 @Autowired 依赖项的 Bean Validation 约束验证器.它包含两个构造函数:默认构造函数和带依赖项的构造函数

现在您可以创建一个实现 ConstraintValidatorFactory 并使用 MockitoJUnitRunner.class 运行的测试 SomeValidationValidatorTest:

Now you can create a test SomeValidationValidatorTest that implements ConstraintValidatorFactory and is run with MockitoJUnitRunner.class:

@RunWith(MockitoJUnitRunner.class)
public class SomeValidationValidatorTest implements ConstraintValidatorFactory {
    @Mock
    private MyDependency myDependencyMock;
}

您必须从 ConstraintValidatorFactory 实现 getInstance 方法:

You must implement getInstance method from ConstraintValidatorFactory:

@Override
public <T extends ConstraintValidator<?, ?>> T getInstance(Class<T> key) {
    if (key == SomeValidationValidator.class) {
        return (T) new SomeValidationValidator(myDependencyMock);
    }
    throw new IllegalArgumentException("expecting SomeValidationValidator!");
}

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

Having this you can configure the Validator:

@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 解决问题的想法.

The above solution is not perfect but I assume it gives you the idea of using custom ConstraintValidatorFactory to solve the problem.

这篇关于使用 Mockito 和自动装配进行 JSR 303 bean 验证单元测试的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆