how to treat controller exception with mockmvc

tzortzik picture tzortzik · Apr 12, 2015 · Viewed 19.9k times · Source

I am using MockMVC to test my controller.

I have the following controller:

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;
    }

}

And my current test looks like this:

@Test
public void testGetAllLimit0() throws Exception {
    mockMvc.perform(get("/A/get")
            .param("limit","0")
            )
            .andDo(print())
            .andExpect(...);
}

I am instantiating MockMVC with this:

@Before
public void setup() {
    this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
}

How can I take care of that exception thrown in my controller?

Later Edit:

I'm not sure what happened in my code recently but it passes the test:

@Test
public void testGetAllLimit0() throws Exception {
    mockMvc.perform(get("/A/get")
            .param("limit","0")
            )
            .andDo(print())
            .andExpect(status().is(500));
}

It still passes if I replace is(500) with isOk(). And this is not good, I should check somehow for that exception.

If I run a gradle build I get this:

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

Answer

mrkernelpanic picture mrkernelpanic · Apr 13, 2015

Did you try to use a custom ExceptionHandler like here? : https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

If you do so you can return custom HTTP response codes and verify them in your test.