2014-11-21 48 views
4

我想junit测试我的验证器类,但我的验证器类具有@autowired服务类。我如何使用Mocikto注入这些依赖关系?用Mockito和Autowiring测试JSR 303 bean验证单元

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

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

回答

9

线要做到这一点,我创建定制ConstraintValidatorFactory提供我的自定义ConstraintValidator。

假设我们有以下几点:

  1. SomeValidation - Bean验证约束注释
  2. SomeValidationValidator - Bean验证约束验证与@Autowired依赖。它包含两个构造函数:默认而这需要依赖

现在,您可以创建一个实现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解决问题的想法。