본문 바로가기
Spring

Spring - Mock Test Annotation & Method 정리

by devLog by Ronnie's 2022. 4. 7.

들어가며


개발을 하다보면 개발해야 될 로직에 대해서 테스트 케이스를 작성하게 된다. 이때 테스트하려는 객체가 복잡한 의존성을 가지고 있는 경우에는 모킹한 객체를 이용하면 의존성을 단절시킬 수 있어서 테스트할때 용이하다. 목객체를 사용한 테스트 방법에 대하여 정리한다.

 

mock?


테스트를 위해 실제 객체와 비슷한 모의 객체를 만드는 것을 mocking이라고 한다. 모킹한 객체를 메모리에서 얻어내는 과정은 mock-up이라고 한다. 웹 어플리케이션에서 컨트롤러를 테스트할때, 서블릿 컨테이너를 모킹하기 위해서는 @WebMvcTest 또는 @AutoConfigureMockMvc 를 이용하면 된다. 

 

@WebMvcTest


  • @Controller, @RestController 가 설정된 클래스들을 찾아 메모리에 생성
  • @ControllerAdvice, @JsonComponent 자동 설정 영역
  • @Service, @Repository, @Component가 붙은 객체들은 테스트 대상이 아닌 것으로 처리되어 생성되지 않음
  • @WebMvcTest가 설정된 테스트 케이스에서는 서블릿 컨테이너를 모킹한 MockMvc 타입의 객체를 목업하여 컨트롤러에 대한 테스트 코드를 작성할 수 있다.
  • 웹상의 요청과 응답에 대해 테스트가 가능하며 시큐리티 혹은 필터까지 테스트 가능하다.
  • 실제 구동되는 어플리케이션과 똑같이 컨텍스트를 로드하는 @SpringBootTest 어노테이션보다 가볍게 테스트 할 수 있다.

 

@AutoConfigureMockMvc


  • @WebMvcTest와 마찬가지로 MVC 컨트롤러 테스트를 할 수 있다.
  • @WebMvcTest와 차이점은 컨트롤러 뿐만 아니라 테스트 대상이 아닌 @Service나 @Repository가 붙은 객체들도 모무 메모리에 올린다. (그래서 간단하게 MVC 테스트가 목적일시 @AutoConfigureMockMvc보다 @WebMvcTest 사용 권장)
  • 대신 MockMvc를 보다 세밀하게 제어가 가능하며, 전체 어플리케이션 구성을 로드하고 MockMvc를 사용하는 경우 @AutoConfigureMockMvc와 결합된 @SpringBootTest 사용 권장
  • @SpringBootTest에는 웹 어플리케이션 테스트를 지원하는 webEnvironment 속성이 존재하는데 이 속성값의 디폴트 값은 WebEnvironment.Mock 이며 이 설정에 의해서 서블릿 컨테이너가 모킹된다. 

 

** @WebMvcTest는 @SpringBootTest와 같이 사용하면 서로의 MockMvc를 모킹하므로 충돌이 발생하여 같이 사용될 수 없으니 주의.

 

 

MockMvc 메서드


perform()

  • 해당 메서드를 통해 브라우저에서 서버에 URL을 요청하듯 컨트롤러를 실행 가능
  • RequestBuilder 객체를 인자로 받으며 RequestBuilder 객체는 MockMvcRequestBuilder의 정적 메서드를 이용해서 생성한다.

  • MockMvcRequestBuilder의 메서드들은 CRUD 요청 방식과 매핑되는 get(), post(), put(), delete() 메서드를 제공한다.
  • 해당 메서드들의 파라미터로 http 요청 프로토콜에 요청 관련 정보를 설정한다. ( ex -> get(“/api/v1/member/1”) -> 멤버조회 )
  • 이외에도 헤더, 쿠키 등의 정보도 설정 가능.
  • 파라미터가 있을 시 get().param() 으로 설정 가능하며 파라미터가 여러개 일때 체이닝을 제공한다. (.param().param() 으로 사용 가능)

 

andExpect()

  • perform() 메서드를 이용하여 요청을 전송하면 그 결과로 ResultActions 객체를 리턴하는데 해당 응답 결과를 검증할 수 있는 메서드가 andExpect() 이다.
  • andExpect() 메서드가 요구하는 ResultMatcher 객체는 MockMvcResultMatchers에 정의된 정적 메서드를 통해 생성할 수 있다. 

  • 다음과 같이 임포트하여 MockMvcResultMatchers를 생략하고 사용 가능하다.
  • .andExpect(status().) -> status() 관련 응답 상태 코드 검증

  • andExpect(view())를 통하여 뷰 검증 가능
  • andExpect(redirectedUrl()을 통하여 리다이렉트 검증 가능
  • andExpect(model()을 통하여 모델 정보 검증 가능
  • andExpect(jsonPath())
  • 응답 형식이 json 일때 사용 가능하다.
  • 다음과 같이 json 객체에 키값을 명시하고 .value()를 통해 예측하는 값을 검증한다.

 

andDo()

  • 요청/응답 전체 메시지 확인 가능
  • perform() 메서드가 리턴하는 ResultActions의 andDo(ResultHandler handler) 메서드를 사용
  • 콘솔에 요청/응답과 관련된 정보를 모두 출력한다.
  • 추가팁 (andDo()와 같이 모든 테스트에 공통적으로 사용하는 설정은 공통 설정을 해줄 클래스를 만들어 각 테스트마다 @BeforeEach 를 통해 테스트 케이스 실행전 설정 부분 메서드를 호출하여 세팅할 수 있도록 하면 편리하게 사용 가능함.)
  • ex) 아래와 같이 MockMvcBuilders의 셋팅할때 .alwayDo<DefaultMockMvcBuilder>(print()) 를 통해 설정 가능

 

 

댓글