gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:38:45 24 4
gpt4 key购买 nike

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

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

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

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

另一件事是我不想使用 Spring Autowiring 并使用 @Mock and @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 约束验证器。它包含两个构造函数:默认构造函数和带依赖关系的构造函数

  • 现在您可以创建一个实现 ConstraintValidatorFactory 并使用 MockitoJUnitRunner.class 运行的测试 SomeValidationValidatorTest:
    @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 解决问题的想法。

    关于validation - 使用 Mockito 和 Autowiring 进行 JSR 303 bean 验证单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27062638/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com