memostack
article thumbnail
블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.tistory.com/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
반응형

REST API 테스트

Rest API를 테스트할 때는 @WebMvcTest 어노테이션을 사용한다.

 

MockMvc를 생성할때는 MockMvcBuilders를 사용하여 생성한다.

  • 다른 방법으로 MockMvcBuilders를 사용하지 않고, MockMvc에 @Autowired를 사용하여 자동으로 생성하여 주입할 수 있다.
@ExtendWith(SpringExtension.class)
@WebMvcTest(MemberController.class)
@DisplayName("MemberController 테스트")
class MemberControllerTest {

  private MockMvc mvc;

  @MockBean private MemberService memberService;

  @BeforeEach
  public void setUp() {
    mvc =
        MockMvcBuilders.standaloneSetup(new MemberController(memberService))
            .addFilters(new CharacterEncodingFilter("UTF-8", true)) // utf-8 필터 추가
            .build();
  }
  // ... 중략 ...
}

 

테스트 코드 작성

jsonPath()를 사용하여 Response로 넘어온 데이터를 JSON 형태로 파싱 하여 바로 값을 가져올 수 있다. 

// ...중략...

import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.filter.CharacterEncodingFilter;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.BDDMockito.given;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@ExtendWith(SpringExtension.class)
@WebMvcTest(MemberController.class)
@DisplayName("MemberController 테스트")
class MemberControllerTest {

  private MockMvc mvc;

  @MockBean private MemberService memberService;

  @BeforeEach
  public void setUp() {
    mvc =
        MockMvcBuilders.standaloneSetup(new MemberController(memberService))
            .addFilters(new CharacterEncodingFilter("UTF-8", true)) // utf-8 필터 추가
            .build();
  }

  @Test
  @DisplayName("회원가입 테스트")
  void insertMemberTest() throws Exception {
    // given
    final LocalDateTime now = LocalDateTime.now();
    given(memberService.insertMember(any()))
        .willReturn(
            Member.builder()
                .id(1L)
                .email("test@gmail.com")
                .password("1234")
                .name("Test User")
                .phone("010-1234-5678")
                .address("서울")
                .isActive(true)
                .registerAt(now)
                .passwordUpdatedAt(now)
                .build());

    // when
    final ResultActions actions =
        mvc.perform(
            post("/rest/api/v1/member")
                .contentType(MediaType.APPLICATION_JSON)
                .accept(MediaType.APPLICATION_JSON)
                .characterEncoding("UTF-8")
                .content(
                    "{"
                        + "  \"email\" : \"test@gmail.com\", "
                        + "  \"password\" : \"1234\", "
                        + "  \"name\": \"Test User\", "
                        + "  \"phone\": \"010-1234-5678\", "
                        + "  \"address\": \"서울\" "
                        + "}"));

    // then
    actions
        .andExpect(status().isCreated())
        .andExpect(jsonPath("email").value("test@gmail.com"))
        .andExpect(jsonPath("name").value("Test User"))
        .andExpect(jsonPath("phone").value("010-1234-5678"))
        .andExpect(jsonPath("address").value("서울"));
  }
}

테스트 성공


다른 글

2021/01/06 - [Spring/Spring Boot] - SpringBoot, Junit5에서 JPA Repository 테스트

 

SpringBoot, Junit5에서 JPA Repository 테스트

사전 준비 테스트를 위해, Entitiy와 Repository를 생성한다. Entity 생성 Role.java @Entity @Table(name = "role") @Getter @Builder @NoArgsConstructor @AllArgsConstructor(access = AccessLevel.PROTECTED)..

memostack.tistory.com

2021/01/13 - [Spring/Spring Boot] - SpringBoot, Junit5에서 Service 테스트

 

SpringBoot, Junit5에서 JPA Service 테스트

서비스 작성 MemberService.java 생성자 주입을 통해, MemberRepository 와 BCryptPasswordEncoder 를 주입한다. BCryptPasswordEncoder 는 시큐리티에 Bean 을 생성했다. (아래 펼쳐서 확인) 더보기 @Configurati..

memostack.tistory.com

 

반응형
블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.tistory.com/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
profile

memostack

@bluemiv_mm

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!