簡體   English   中英

如何使用 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));
}

如果我用isOk()替換is(500) ,它仍然會通過。 這不好,我應該以某種方式檢查該異常。

如果我運行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

如果這樣做,您可以返回自定義 HTTP 響應代碼並在測試中驗證它們。

更簡單的方法是將@ExceptionHandler注入你的 Spring 測試上下文,或者它在MockMvc.perform()之前的.andExpect()拋出異常。

@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的異常!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM