이번 포스팅에서는 프로젝트를 서버에 배치하지 않은 채로 웹 프레젠테이션 계층을 쉽게 테스트할 수 있는 방법을 알아볼 것이다.
1. 서블릿 테스트용 Mock 오브젝트
1) MockHttpServletRequest
(1) 생성
- HttpServletRequest는 HTTP의 요청정보를 담은 객체다.
- 다음과 같이 HTTP 메소드와 URI를 포함하여 생성하면 된다.
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/home");
(2) 유용한 메소드
- void setParameter(String name, String value) : String형 파라미터를 지정
- void setAttribute(String name, Object value) : Object형 파라미터를 지정
- void setRemoteHost(String remoteHost) : 클라이언트의 host 값을 지정
- void setRemoteAddr(String remoteAddr) : 클라이언트의 ip 주소를 지정
- void setCookies(Cookie... cookies) : 쿠키 설정
- void setSession(HttpSession session) : 세션 설정
2) MockHttpServletResponse
(1) 생성
- HttpServletResponse 객체는 응답 정보를 넣을 수 있도록 서블릿 컨테이너가 미리 서블릿에게 전달해주는 객체다.
MockHttpServletResponse response = new MockHttpServletResponse();
- MockHttpServletResponse는 서블릿 작업의 결과를 검증할 때 쓸 수 있는 유용한 메소드들을 제공한다.
(2) 유용한 메소드
- String getContentAsString() : 결과를 String으로 반환
- String getContentAsByteArray() : 결과를 바이트 배열로 반환
- Cookie[] getCookies()
- String getContentType()
- String getErrorMessage()
3) MockHttpSession
- HttpSession은 서버에 저장되는 정보 저장 객체다.
- 세션에 미리 값을 넣을 수도 있고, 세션의 조작 결과를 조회할 수도 있다.
- MockHttpServletRequest에는 이미 빈 MockHttpSession이 생성되어 있다.
4) MockServletConfig, MockServletContext
- 서블릿에 대한 설정을 변경하여 테스트하기 위한 객체다. 드물게 사용된다.
- 서블릿 컨텍스트 레벨에 저장해둔 오브젝트를 사용하는 경우에 사용된다.
- WebApplicationContextUtils를 사용하여 루트 컨텍스트를 가져오는 과정을 테스트 하고 싶다면, MockServletContext에 루트 컨텍스트를 넣으면 된다.
2. Controller 테스트
- 프로젝트를 서버에 배치하지 않고도 컨트롤러를 테스트할 수 있다.
- 토비의 스프링 교재에서는 테스트를 위해 DispatcherServlet 클래스를 상속해서 컨텍스트 초기화 기능과 편리한 설정 기능을 추가한 ConfigurableDispatcherServlet 클래스 코드를 제공한다. 이 ConfigurableDispatcherServlet은 xml 설정 방식과 클래스 설정 방식을 모두 지원하고, 컨트롤러에서 사용된 ModelAndView 객체를 받아올 수 있게 하여 컨트롤러의 뷰 결과물인 모델과 뷰 정보를 확인할 수 있게 만들어졌다.
- 토비의 스프링 교재에서는 테스트 클래스에서 직접 상속해서 사용할 수 있는 AbstractDispatcherServletTest 클래스 코드도 제공한다. 테스트 코드가 간결해지며, AbstractDispatcherServletTest의 메소드들은 대부분 작업 후에 자기 자신을 반환하기 때문에 메소드를 체인식으로 연결하여 작성할 수 있다.
ConfigurableDispatcherServlet, AbstractDispatcherServletTest
- 위에 언급한 두 클래스 코드와 코드에 대한 설명은 아래 첨부한 블로그에 잘 설명되어 있다. 이 포스팅에 AfterRunService 인터페이스 코드는 누락되어 있기 때문에 바로 아래에 첨부하도록 하겠다.
https://honeyinfo7.tistory.com/134
<AfterRunService>
- 토비의 스프링 교재에서 제공하는 인터페이스 코드다.
public interface AfterRunService {
// 뷰의 작업 결과를 확인
String getContentAsString() throws UnsupportedEncodingException;
// 서블릿 컨텍스트를 반환
WebApplicationContext getContext();
// 지정한 타입의 bean을 서블릿 컨텍스트로부터 반환
<T> T getBean(Class<T> beanType);
// 컨트롤러가 반환한 ModelAndView를 반환
ModelAndView getModelAndView();
// 뷰 이름을 검증
AfterRunService assertViewName(String viewname);
// 모델을 검증
AfterRunService assertModel(String name, Object value);
}
● 참고 자료 : 토비의 스프링 3.1 Vol.2
'Spring Series > Spring Framework' 카테고리의 다른 글
[Spring] View의 종류와 다양한 전략 (0) | 2022.07.22 |
---|---|
[Spring] Controller의 종류와 다양한 전략 (0) | 2022.07.16 |
[Spring] DispatcherServlet의 DI 전략 (0) | 2022.07.13 |
[Spring] @Transactional의 속성 (0) | 2022.07.09 |
[Spring] Hibernate (0) | 2022.07.06 |
댓글