【问题标题】:How to check Bad request for @Min on request param in spring controller?如何检查弹簧控制器中请求参数上@Min的错误请求?
【发布时间】:2020-06-25 19:37:55
【问题描述】:

我对弹簧控制器很陌生。我正在尝试为无效参数编写单元测试。我有一个具有@RequestParam("id") @Min(1) long id 的api,在我的单元测试中,我传入了“-1”。这是我的测试:

@Test
    public void searchWithInvalidIbId() throws Exception {
        mockMvc.perform(get(BASE_URL)
            .param(COLUMN_IB_ID, INVALID_IB_ID_VALUE) // = "-1"
            .param(COLUMN_TIME_RANGE, TIME_RANGE_VALUE)
            .param(COLUMN_TIME_ZONE, TIME_ZONE_VALUE)
            .accept(PowerShareMediaType.PSH_DISPATCH_REPORTER_V1_JSON)
            .contentType(PowerShareMediaType.PSH_DISPATCH_REPORTER_V1_JSON))
            .andExpect(status().isBadRequest());
    }

当我运行它时,我得到了

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is javax.validation.ConstraintViolationException: search.arg2: must be greater than or equal to 1

这是有道理的,但我不确定如何测试这是 BadRequest。我尝试了@Test(expected = NestedServletException.class),它通过了,但我认为它不是在检查我想要检查的内容。检查这个的正确方法是什么?

【问题讨论】:

  • 你在 ExceptionHandler 中处理ConstraintViolationException 吗?
  • 我的回答是否解决了您的问题@Jonathon Hagen?如果是这样,您可以将其标记为正确答案。

标签: spring rest unit-testing mockmvc


【解决方案1】:

您可以使用 @ControllerAdvice 注释您的自定义异常处理程序,并在该类中处理 ConstraintViolationException。如果您愿意,您可以抛出带有其他详细信息的自定义异常。

这是一个示例方法:

@ControllerAdvice
public class MyCustomExceptionHandler {
    @ResponseBody
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(ConstraintViolationException.class)
    ApiError constraintViolationException(ConstraintViolationException e) {
        return BAD_REQUEST.apply(e.getBindingResult());
    }
}

这里的 ApiError 是一个自定义类来表示您的错误响应,它可以是您想要的任何其他内容。您可以添加时间戳、http 状态、错误消息等。

【讨论】:

  • 我们决定停止这个问题,所以我无法对此进行测试。一旦我回到这个问题,我会检查它。还是谢谢!
猜你喜欢
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
  • 2016-08-18
  • 1970-01-01
  • 2020-05-13
  • 2020-06-25
相关资源
最近更新 更多