Write JUnit test for @ExceptionHandler

后端 未结 3 2282
-上瘾入骨i
-上瘾入骨i 2021-02-19 21:35

I am writing a Rest service using Spring MVC. Here is the outline of the class:

 @Controller
 public class MyController{

     @RequestMapping(..)
     public vo         


        
相关标签:
3条回答
  • 2021-02-19 22:09

    Consider using Spring 3.2 and its mvc-test-framework

    import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*;
    import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @WebAppConfiguration
    @ContextConfiguration("file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml")
    public class WebMvcTest {
    
        @Autowired
        private WebApplicationContext wac;
    
        private MockMvc mockMvc;
    
        @Before
        public void setup() {
            this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
        }
    
        @Test
        public void getFoo() throws Exception {
            this.mockMvc.perform(
                get("/testx")
                .contentType(MediaType.APPLICATION_JSON)
                .accept(MediaType.APPLICATION_JSON)
                )
                .andExpect(status().isUnauthorized());
        }
    }
    

    Controller code

    @Controller
    public class MyController {
    
        public class MyException extends RuntimeException {
        };
    
        @RequestMapping("/testx")
        public void myMethod() {
            throw new MyException();
    
        }
    
        @ExceptionHandler(MyException.class)
        @ResponseStatus(value = HttpStatus.UNAUTHORIZED, reason = "blah")
        public void handler() {
            System.out.println("handler processed");
        }
    }
    

    This "test" passes well.

    Disclaimer: currently I'm a noob in Spring MVC testing, actually it's my first test.
    upd: Thanks to The Drake for the correction.

    0 讨论(0)
  • 2021-02-19 22:10

    Annotate your Exception Handling controller with @ControllerAdvice instead of @Controller.

    As Boris Treukhov noted when adding the @ExceptionHandler annotation to a method in the controller that throws the exception will make it work but only from that specific controller.

    @ControllerAdvice will allow your exception handeling methods to be applicable for your whole application not just one specific controller.

    0 讨论(0)
  • 2021-02-19 22:12

    You could change @Test to

    @Test(expected=NotAuthorizedException.class)
    

    This would return true if the internals throw up that exception and false otherwise.

    This would also make the assertThat() unnecessary. You could write a second test that catches the NotAuthorizedException then you could inspect the responseMock under that condition then.

    0 讨论(0)
提交回复
热议问题