2016-08-01 4 views
2

Я пытаюсь выполнить единичный тест в Spring Boot 1.4 для проверки моей проверки, возвращает значение 400 на недопустимый параметр строки запроса.Spring Boot 1.4 Проверка модуля Hibernate Validation WebMvcTest

Контроллер

@RestController 
@Validated 
public class ExampleController { 

    ... 

    @RequestMapping(value = "/example", method = GET) 
    public Response getExample(
      @RequestParam(value = "userId", required = true) @Valid @Pattern(regexp = MY_REGEX) String segmentsRequest { 

     // Stuff here 
    } 

} 

Исключение Обработчик

@ControllerAdvice 
@Component 
public class GlobalExceptionHandler { 

    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class); 

    // 400 - Bad Request 
    @ExceptionHandler(value = {ConstraintViolationException.class}) 
    @ResponseStatus(HttpStatus.BAD_REQUEST) 
    public void constrainViolationHandle(HttpServletRequest request, ConstraintViolationException exception) { 
     logger.error("Error Bad Request (400)"); 
    } 

} 

Контекст

@Bean 
public Validator validator() { 
    final ValidatorFactory validatorFactory = Validation.byDefaultProvider() 
      .configure() 
      .parameterNameProvider(new ReflectionParameterNameProvider()) 
      .buildValidatorFactory(); 
    return validatorFactory.getValidator(); 
} 

@Bean 
public MethodValidationPostProcessor methodValidationPostProcessor() { 
    final MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor(); 
    methodValidationPostProcessor.setValidator(validator()); 
    return methodValidationPostProcessor; 
} 

Unit Test

@RunWith(SpringRunner.class) 
@WebMvcTest(ExampleController.class) 
public class ExampleControllerTest { 

    private static final String EMPTY = ""; 

    @Autowired 
    private MockMvc mvc; 

    @Test 
    public void test() throws Exception { 

     // Perform Request 
     ResultActions response = this.mvc.perform(
      get("/example").param("userId", "invalid") 
     ); 

     // Assert Result 
     response.andExpect(status().isBadRequest()) 
       .andExpect(content().string(EMPTY)); 
    } 

} 

Однако, когда я запускаю мой тест я получаю 200 не 400. Валидация не выполняется, когда я запускаю как приложение, а не как тест.

Я полагаю, что это может быть связано с тем, что он не подбирает два валидации при выполнении теста? Эта валидация работает

ответ

1

@WebMvcTest аннотация, которую вы используете, представляет собой упаковку Spring Boot поверх так называемой автономной конфигурации MockMvc. Эта функция MockMvc проверяет автономный контроллер без каких-либо других компонентов.

Чтобы иметь возможность протестировать широкий веб-конфигурацию, которую нужно использовать web application setup:

@RunWith(SpringRunner.class) 
@WebAppConfiguration 
@ContextConfiguration("my-servlet-context.xml") 
public class MyWebTests { 

    @Autowired 
    private WebApplicationContext wac; 

    private MockMvc mockMvc; 

    @Before 
    public void setup() { 
     this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); 
    } 

    // ... 

} 

Но обратите внимание, что установка таких веб-приложение не подобрать все бобы. Например, вам нужно будет явно регистрировать фильтры Servler или Spring Security. Но я считаю, что валидация должна быть включена.

+0

Я пробовал это, но потом я получаю 404s – ptimson

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