#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
, и это сработало.