2014-11-21 44 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解決問題的想法。