본문 바로가기
  • 실행력이 모든걸 결정한다
Spring Series/Spring Framework

[Spring] 웹 프레젠테이션 계층 테스트

by 김코더 김주역 2022. 7. 14.
반응형

이번 포스팅에서는 프로젝트를 서버에 배치하지 않은 채로 웹 프레젠테이션 계층을 쉽게 테스트할 수 있는 방법을 알아볼 것이다.

 

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

 

스프링 컨트롤러 테스트(MockHttpServletRequest, MockHttpServletResponse)

Service나 DAO 같은 비즈니스 로직과 달리 Controller의 경우 테스트 코드를 만들기가 되게 애매하다. 이유는 Service나 Dao와 달리 Controller의 경우 Http Request나 Response등의 요청이 필요하고 또한 결과값..

honeyinfo7.tistory.com

 

<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

반응형

댓글