Проблема Spring @ Value в пользовательском ConstraintValidator для модульного тестирования

#java #spring #junit

#java #spring #junit

Вопрос:

Я использую Spring версии 4.1.6.RELEASE. У меня есть следующий пользовательский ConstraintValidator.

 public class CountryCodeValidator implements ConstraintValidator<CountryCode, String> {
    private List<String> allowedCountries;

    @Autowired
    public void setAllowedCountries(@Value("${allowed.countries}")String countries) {
        allowedCountries = Arrays.asList(countries.split(","));
    }

    @Override
    public void initialize(CountryCode constraintAnnotation) {  }

    @Override
    public boolean isValid(String countryCode, ConstraintValidatorContext ctx) {
        return null != countryCode amp;amp; allowedCountries.contains(countryCode.toUpperCase());
    }
}
  

и у меня есть следующая аннотация

 @Documented
@Constraint(validatedBy = CountryCodeValidator.class)
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface CountryCode {

    String message() default "{CountryCode}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}
  

Я использую это в объекте запроса, подобном следующему

 @CountryCode(message = MessageKeys.COUNTRY_CODE_INVALID)
private String countryCode;
  

Когда я запускаю приложение, все работает так, как ожидалось. Однако в модульном тестировании для контроллера происходит сбой.

Мой код модульного тестирования выглядит следующим образом

 @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:/test-context.xml")
public class ControllerTest {

    @InjectMocks
    private Controller controller;

  @Before
    public void init() {
        MockitoAnnotations.initMocks(this);
  }

  @Test
    public void testEndpoint()  {
        Request request = new Request();
        RestAssuredMockMvc.given().standaloneSetup(controller).contentType(MediaType.APPLICATION_JSON_VALUE).body(request)
                .post("/endpoint").then().statusCode(HttpStatus.OK.value());
    }
}
  

При запуске кода я не смог получить @Value(«${allowed.countries}»), поэтому я получаю исключение нулевого указателя в методе isValid.

Чего мне не хватает?

Заранее спасибо

Комментарии:

1. Похоже, @ContextConfiguration это портит вашу конфигурацию. Определили ли вы значение для своего allowed.countries свойства в test-context.xml контексте?

2. у теста есть свои собственные ресурсы, поэтому я думаю, вам также нужно указать значение allowed.countries в файле свойств теста, если вы этого еще не сделали.

3. Проблема в том, что standAloneSetup не инициализируется @Value . Я использовал webAppContextSetup , и это сработало.