[Spring] MockMVC를 이용한 Test

Jungwoong (David) Yoon·2023년 8월 6일
0

Test

목록 보기
1/2

개인 프로젝트 중에 controller를 리팩토링하고 REST API를 구현하는 작업을 하면서 MockMVC로 간편하게 controller를 테스트할 수 있다는 것을 알게되었다.


MockMVC 란?


서블릿 컨테이너의 구동 없이, 시뮬레이션된 MVC 환경에 모의 HTTP 서블릿 요청을 전송하는 기능을 제공하는 유틸리티 클래스다.

쉽게 말해, 실제 객체와 비슷하지만 테스트에 필요한 기능만 가지는 "가짜 객체" 를 만들어 애플리케이션 서버에 배포하지 않고도 스프링 MVC 동작을 재현할 수 있는 클래스를 의미한다.


사용 방법 (설정)


Test 클래스에 @AutoConfigureMockMvc annotation을 선언하고 안에 MockMVC 를 주입 받으면 사용할 수 있다.

@SpringBootTest
@AutoConfigureMockMvc
class UserApiControllerTest {

    @Autowired
    MockMvc mockMvc;
    
    ...
}

단독 실행

@Before
public void setUpMockMvc() {
	this.mockMvc = MockMvcBuilders.standaloneSetup(new UserApiController()).build();
}

UserApiController 만 테스트한다는 의미이다. 단위 테스트에서 자주 쓰이며, 대상 Controller를 커스텀 할 수 있다.


필터 추가

addFilter() 로 필터를 추가할 수 있다.


테스트 실행


mockMvc.perform(post("/api/users"))

perform() 을 이용하여 위에서 설정한 MockMvc를 실행 가능하다.


요청 설정 method

여러가지 요청 설정도 가능하다.

  • param() / params() : 쿼리 스트링 설정

  • header() / headers() : 요청 헤더 설정

  • cookie() : 쿠키 설정

  • requestAttr() : 요청 스코프 객체 설정

  • sessionAttr() : 세션 스코프 객체 설정

  • content() : 요청 본문 설정

  • contentType() : 본문 타입 설정

예시:

mockMvc.perform(post("/api/users")
				.content(content)
                .contentType(MediaType.APPLICATION_JSON))
                

검증 method

  • status() : 상태 코드 검증

  • header() : 응답 header 검증

  • content() : 응답 본문 검증

  • cookie() : 쿠키 상태 검증

  • view() : 컨트롤러가 반환한 뷰 이름 검증

  • redirectedUrl(Pattern) : 리다이렉트 대상의 경로 검증

  • model : 스프링 MVC 모델 상태 검증

  • request : 세션 스코프, 비동기 처리, 요청 스코프 상태 검증

  • forwardedUrl : 이동대상의 경로 검증

예시:

// 요청 성공
mockMvc.perform(post("/api/users")
				.content(content)
                .contentType(MediaType.APPLICATION_JSON)
        )
        .andDo(print())
        .andExpect(status().isOk())
        .andExpect(jsonPath("id").value("1"))
        .andExpect(jsonPath("username").value("tester"))
        .andExpect(jsonPath("email").value("test@gmail.com"));
// 요청 실패
mockMvc.perform(post("/api/users")
				.content(wrongContent)
                .contentType(MediaType.APPLICATION_JSON)
        )
        .andDo(print())
        .andExpect(status().is4xxClientError());

참고
status().is4xxClientError() 를 사용하면 요청 실패도 확인이 가능하다.



Reference:

https://spring.io/guides/gs/testing-web/

profile
깨부하는 개발자

0개의 댓글