如何使用 mockmvc 处理控制器异常
how to treat controller exception with 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){
throw new IllegalArgumentException();
}
...
return aDTOs;
}
}
我目前的测试是这样的:
@Test
public void testGetAllLimit0() throws Exception {
mockMvc.perform(get("/A/get")
.param("limit","0")
)
.andDo(print())
.andExpect(...);
}
我正在用这个实例化 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));
}
我把is(500)
换成isOk()
还是可以通过的。这不好,我应该以某种方式检查该异常。
如果我 运行 a gradle build
我明白了:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalArgumentException
您是否尝试像此处一样使用自定义 ExceptionHandler? : https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc
如果这样做,您可以return自定义 HTTP 响应代码并在您的测试中验证它们。
更简单的方法是将 @ExceptionHandler
注入到您的 Spring 测试上下文中,否则它会在 .andExpect()
.
之前的 MockMvc.perform()
中抛出异常
@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();
}
那样 MvcResult.getResolvedException()
持有 @Controller
的例外!
- Testing Spring MVC @ExceptionHandler method with Spring MVC Test
我正在使用 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;
}
}
我目前的测试是这样的:
@Test
public void testGetAllLimit0() throws Exception {
mockMvc.perform(get("/A/get")
.param("limit","0")
)
.andDo(print())
.andExpect(...);
}
我正在用这个实例化 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));
}
我把is(500)
换成isOk()
还是可以通过的。这不好,我应该以某种方式检查该异常。
如果我 运行 a gradle build
我明白了:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalArgumentException
您是否尝试像此处一样使用自定义 ExceptionHandler? : https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc
如果这样做,您可以return自定义 HTTP 响应代码并在您的测试中验证它们。
更简单的方法是将 @ExceptionHandler
注入到您的 Spring 测试上下文中,否则它会在 .andExpect()
.
MockMvc.perform()
中抛出异常
@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();
}
那样 MvcResult.getResolvedException()
持有 @Controller
的例外!
- Testing Spring MVC @ExceptionHandler method with Spring MVC Test