我想对我的验证器类进行 junit 测试,但我的验证器类有@autowired服务类。如何使用 Mocikto 注入这些依赖项?
我将使用以下代码行调用验证器。
Set<ConstraintViolation<MyDomainPOJOObject>> constraintViolationsFromJavaRules = validator.validate(myDomainPOJOObject, Default.class);
问题是我没有自己实例化验证器类。它是JSR 303框架,它真正调用了验证者的isValid方法()。
另一件事是我不想使用弹簧自动布线并使用@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);
}
为了实现这一点,我创建了自定义约束验证器工厂来提供我的自定义约束验证器。
假设我们有以下内容:
- 某些验证 - Bean 验证约束注释
- SomeValidationValidator - 具有@Autowired依赖项的 Bean Validation 约束验证器。它包含两个构造函数:默认构造函数和依赖关系构造函数
现在,您可以创建一个测试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!");
}
有了这个,你可以配置验证器:
@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);
}
上面的解决方案并不完美,但我认为它给了你使用自定义约束验证器工厂来解决问题的想法。