Java 如何用mockmvc处理控制器异常

Java 如何用mockmvc处理控制器异常,java,spring,mockmvc,Java,Spring,Mockmvc,我正在使用MockMVC测试我的控制器 我有以下控制器: public class A{ ... @RequestMapping("/get") public List<ADTO> get(@RequestParam(defaultValue = "15", required = false) Integer limit) throws IOException { if(limit <= 0 || limit >= 50){

我正在使用MockMVC测试我的控制器

我有以下控制器:

public class A{

    ...

    @RequestMapping("/get")
    public List<ADTO> get(@RequestParam(defaultValue = "15", required = false) Integer limit) throws IOException {
        if(limit <= 0 || limit >= 50){
            throw new IllegalArgumentException();
        }
        ...
        return aDTOs;
    }

}
我正在用以下内容实例化MockMVC:

@Before
public void setup() {
    this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
}
我如何处理控制器中抛出的异常

稍后编辑:

我不确定我的代码最近发生了什么,但它通过了测试:

@Test
public void testGetAllLimit0() throws Exception {
    mockMvc.perform(get("/A/get")
            .param("limit","0")
            )
            .andDo(print())
            .andExpect(status().is(500));
}
如果我用
isOk()
替换
is(500)
,它仍然通过。这是不好的,我应该以某种方式检查例外情况

如果我运行一个
gradle构建
,我会得到以下结果:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalArgumentException

您是否尝试使用类似于此处的自定义异常处理程序


如果您这样做,您可以返回自定义HTTP响应代码并在测试中验证它们。

更简单的方法是将
@ExceptionHandler
注入到Spring测试上下文中,或者它在
MockMvc.perform()
之前抛出异常

这样,
MvcResult.getResolvedException()
就可以保存
@Controller
的异常


当控制器抛出此类异常时,您希望得到什么样的HTTP响应?我估计会有500个错误。如果这是您期望的,那么这就是您的测试应该验证的。如果您预期会出现另一个错误(错误400更合适),那么请测试您在测试中是否会遇到这样的错误,并修复代码,直到测试通过。我已经尝试预期会出现500个错误,但它不起作用,因为它会在抛出错误时停止执行。我更新了我的初始帖子。奇怪的事情发生了。
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalArgumentException
@ContextConfiguration(classes = { My_ExceptionHandler_AreHere.class })
@AutoConfigureMockMvc
public class Test {
    @Autowired
    private MockMvc mvc;

    @Test
    public void test() {
        RequestBuilder requestBuilder = MockMvcRequestBuilders.post("/update")
                .param("branchId", "13000")
                .param("triggerId", "1");
        MvcResult mvcResult = mvc.perform(requestBuilder)
                .andExpect(MockMvcResultMatchers.status().is4xxClientError())
                .andExpect(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON_UTF8))
                .andExpect(__ -> Assert.assertThat(
                        __.getResolvedException(),
                        CoreMatchers.instanceOf(SecurityException.class)))
                .andReturn();
}