[Springboot & Test] mockMvc

jin·2022년 12월 29일
0

Spring Boot

목록 보기
2/8
post-custom-banner

MockMvc 란 ?

  • MockMvc는 웹 애플리케이션을 애플리케이션 서버에 배포하지 않고도 스프링 MVC의 동작을 재현할 수 있는 클래스이다.
@WebMvcTest@SpringBootTest
특징컨트롤러의 역할만을 테스트모든 스프링 빈을 등록
장점1. 특정 클래스만 지정하여 보다 가볍고 빠른 테스트 가능 2. 통합테스트 진행하기 어려운 테스트를 개별적으로 진행 가능애플리케이션의 설정, Bean을 모두 로드하기 때문에 운영환경과 가장 유사한 테스트 가능
단점Mock을 기반으로 테스트하기 때문에, 실제 환경에서 예상 밖의 동작오류 가능성 발생경우 모든 빈을 로드하기 때문에 구동 시간이 오래 걸리고, 테스트 단위가 크기 때문에 디버깅이 어려울 수도 있음
  • @WebMvcTest : 경우 특정 클래스만 지정하여 보다 가볍고 빠른 테스트 가능
  • @SpringBootTest : 모든 빈을 로드하기 때문에 구동 시간이 오래 걸리고, 테스트 단위가 크기 때문에 디버깅이 어려울 수도 있다.

@Test

  • @Test마다 객체가 생성되어 각각의 @Test가 붙은 객체끼리 영향을 주지 않는다.

@MockBean

  • 가짜 객체, 즉 해당 단위 테스트에만 집중할 수 있도록 도와준다

MockMvc 주요 메소드

  • perform : 가상의 요청을 처리한다. return값으로 ResultActions 객체를 받으며, 이 객체는 리턴 값을 검증하고 확인할 수 있는 andExpect()를 제공한다.
  • andExpect : 응답을 검증하는 역할을 한다.
    - status() : 상태 코드 검증
    - content() : 응답 본문 내용 검증
    - model() : 스프링 MVC 모델 상태 검증
  • contentType : xml, json 등 API 호출 결과 값 유형을 설정할 수 있다.
  • andDo : 전체 결과 출력 ( print() )

MockMvc 예시)

@WebMvcTest(PostController.class)
class PostControllerTest {

    @MockBean
    PostService postService;

    @MockBean
    BCryptPasswordEncoder encoder;

    @Autowired
    MockMvc mockMvc;

    @Autowired
    ObjectMapper objectMapper;

    @Test
    @DisplayName("등록 성공")
    @WithMockUser  // 권한 부여
    void post_success() throws Exception {

        PostRequest postRequest = PostRequest.builder()
                .title("안녕")
                .body("안녕하세요")
                .build();
        when(postService.create(any(),any())).thenReturn(PostResponse.builder().message("포스트 등록완료").postId(0L).build());
        mockMvc.perform(post("/api/v1/posts")
                        .with(csrf())
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(objectMapper.writeValueAsBytes(postRequest)))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.result.message").exists())
                .andExpect(jsonPath("$.result.postId").exists())
                .andDo(print());
    }
}
profile
jin
post-custom-banner

0개의 댓글