【发布时间】:2016-08-01 15:23:14
【问题描述】:
我正在尝试在 Spring Boot 1.4 中执行单元测试以测试我的验证在无效查询字符串参数上返回 400。
控制器
@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;
}
单元测试
@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。当我作为应用程序而不是作为测试运行时,不会执行验证。
我相信这可能是因为它在执行测试时没有拾取两个验证 bean? 此验证有效
【问题讨论】:
标签: java spring hibernate unit-testing spring-boot