Filter가 적용이 되어 있는 경우, Filter에 적용되는 bean의 설정을 위해서 XmlWebApplicaionContext를 이용해서 Context객체들을 따로 로딩해줘야지 된다.
순서는 다음과 같다.
- ServletContext의 생성
- XmlWebApplicationContext의 생성 : 이때, Filter에 사용되는 Bean의 설정들은 모두 /WEB-INF/web.xml에 위치하고 있어야지 된다.
- XmlWebApplicationContext에 SevletContext를 주입하고, refresh를 시켜준다.
- 마지막으로, ServletContext에 속성을 추가한 후, MockFilterConfig, MockFilterChain을 이용해서 각각 Filter가 적용되는 Controller들을 테스트 한다.
@Test
public void get() throws Exception {
ServletContext sc = new MockServletContext();
XmlWebApplicationContext wctx = new XmlWebApplicationContext();
wctx.setServletContext(sc);
wctx.refresh();
sc.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, wctx);
assertTrue(wctx.containsBean("sessionFactory"));
MockHttpServletRequest request = new MockHttpServletRequest("GET","/rest/person/get/" + person.getId().toString());
MockHttpServletResponse response = new MockHttpServletResponse();
MockFilterConfig filterConfig = new MockFilterConfig(sc);
MockFilterChain filterChain = new MockFilterChain();
OpenSessionInViewFilter filter = new OpenSessionInViewFilter();
filter.init(filterConfig);
filter.doFilter(request, response, filterChain);
Object handler = handlerMapping.getHandler(request).getHandler();
ModelAndView modelAndView = handlerAdapter.handle(request, response, handler);
System.out.println(response.getContentAsString());
assertNull(modelAndView);
}