콘텐츠로 건너뛰기

MockMvc에서 ExceptionHandler 등록해서 쓰는 방법


단순히 Exception을 throw하면, ExceptionHandler가 Code와 Message를 json형태로 잘 매핑해서 응답하게 됩니다. (추가로 HttpStatusCode까지도 매핑하게 됩니다) 그래서 아래처럼 테스트를 하게 되면 오류가 발생하게 됩니다.


그렇다면 보통 아래처럼 테스트를 고치게 되겠죠?


그러고 나서 테스트를 돌리게 되면 또다른 오류가 발생합니다. 아… ExceptionHandler가 없어서 MockMvc에서 NestedServletException을 throw해버리네요..ㅠ.ㅠ


일반적인 테스트에서 보면 MockMvc에 setHandlerExceptionResolvers()를 이용해서 ExceptionResolver를 셋팅합니다.

사실 ExceptionResolver를 implement한 SimpleMappingExceptionResolver라서 setHandlerExceptionResolvers()가 가능합니다. 그런데 위 코드는 ExceptionResolver의 구현체가 아닙니다.
@ControllerAdvice와 @ExceptionHandler를 이용한 사실상 더 최신식 기술입니다. 이거참 난감합니다. 테스트하려고 어노테이션까지 주입해야…ㅠ.ㅠ 그래서 구글을 찾아보던 중 아래와 같은 답을 발견했습니다.

ApplicationContext를 만들어서 exceptionHandler로 등록을 한 다음에 handlerExceptionResolver()로 get을 하면 등록된 녀석들을 List<ExceptionHandler> 타입으로 리턴해줍니다. 결국 아래와 같이 최종 버전의 테스트가 정상적으로 수행됩니다.


약간은 편법인 듯 하지만, 테스트하려고 하는 관심사가 아닌 부분이기 때문에 ApplicationContext를 로딩한다거나 해서 MvcTest가 무거워지는 것 보다는 훨씬 나은 선택이라 생각됩니다.

 

태그:

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다