как протестировать контроллер отдыха с пользовательской аннотацией в весеннем загрузочном приложении

У меня есть контроллер, как показано ниже

 @GetMapping(value="")
public ResponseEntity<JsonResponse> getLocations(@RequestHeader(value="id") String id, @LocationType @RequestParam(value="locationType" ) String P_STS_AREA_TYP) {

    ...
    return new ResponseEntity<>(response,HttpStatus.OK);
}

@LocationType — это пользовательская аннотация, определение

@Target({ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = LocationTypeValidator.class)
public @interface LocationType {
String message() default "";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};

}

он работает отлично, проверьте тип местоположения, когда приложение работает нормально. но когда я попытался протестировать его с помощью Juint, он перестает работать.

@Test
public void should_return_input_invalid_exception_for_invalid_location_type_for_get_location_endpoint() throws Exception {
    mockMvc.perform(get("/something/something/something")
            .param("locationType", "something")
            .header("id", "12345678"))
            .andExpect(status().isBadRequest());

}

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

аннотации, используемые в тестовом классе

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = { something.class, something.class})

mockito как фиктивный фреймворк

кто-нибудь знает, как заставить пользовательскую аннотацию работать в Junit?

@Plog, мое определение валидатора

public class LocationTypeValidator implements ConstraintValidator<LocationType, String> {

@Autowired
InputValidator inputValidator;
@Override
public void initialize(LocationType locationType) {

}

@Override
public boolean isValid(String locationType, ConstraintValidatorContext constraintValidatorContext) {
    return inputValidator.validateLocationType(locationType);
}

}

я не могу установить Validator, так как он не реализует интерфейс Validator


person user3656690    schedule 18.01.2018    source источник
comment
вы получаете какие-либо ошибки?   -  person Pankaj Gadge    schedule 18.01.2018
comment
нет, просто нет подтверждения   -  person user3656690    schedule 19.01.2018


Ответы (1)


Вам нужно сделать свой собственный валидатор доступным для вашего экземпляра mockMvc. Вы должны быть в состоянии сделать это, автоматически подключая Spring LocalValidatorFactoryBean

@Autowired
private LocalValidatorFactoryBean validator;

...

@Before
public void setUp() {
    mockMvc = MockMvcBuilders.standaloneSetup(myController)
                  .setValidator(validator).build()
}
person Plog    schedule 18.01.2018
comment
я не могу установить Validator (валидатор), так как я реализую как: LocationTypeValidator реализует ConstraintValidator‹LocationType, String› - person user3656690; 19.01.2018
comment
Ой, мой плохой. Чем вы аннотируете свой тестовый класс? - person Plog; 19.01.2018
comment
@RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = {что-то.класс, что-то.класс}) - person user3656690; 22.01.2018
comment
Я обновил свой ответ. Если это не сработает, посмотрите stackoverflow.com/questions/23161752/. Это связано с имитацией валидатора ограничений, но должно пролить свет на то, как заставить ваш экземпляр mockMvc распознать его. - person Plog; 22.01.2018