2014-11-21 2 views
4

Я хочу, чтобы junit проверил мой класс проверки, но мой класс проверки имеет @autowired классы обслуживания. Как мне вставлять эти зависимости с помощью Mocikto?Проверка модуля проверки JAR 303 с помощью Mockito и Autowiring

Я собираюсь вызвать валидатор, используя нижеследующую строку кода.

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

Проблема в том, что я сам не создаю класс валидатора. Это структура JSR 303, которая на самом деле вызывает метод isValid validator().

Другое дело, что я не хочу использовать весенний автоподбор и использовать аннотации @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 Validation ограничения аннотацию
  2. SomeValidationValidator - Bean Validation ограничение валидатор с @Autowired зависимостей. Он содержит два конструктора: по умолчанию и тот, который принимает зависимости

Теперь вы можете создать тестовый SomeValidationValidatorTest, который реализует ConstraintValidatorFactory и работать с MockitoJUnitRunner.class:

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

Вы должны реализовать метод GetInstance от 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!"); 
} 

Имея это можно настроить валидатора:

@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, чтобы решить эту проблему.

Смежные вопросы