쌓고 쌓다

REST API 테스트 코드 작성하기 with MockMVC 본문

프로그래밍/spring

REST API 테스트 코드 작성하기 with MockMVC

승민아 2024. 1. 27. 15:43

 

API를 작성하고 매번 POSTMAN으로 요청과 응답을 확인해보는 과정은 시간도 많이 들고 번거롭다.

 

어떤 코드의 수정이나 추가가 일어났을때 모든 시스템의 API가 정상적으로 돌아가는지 확인하기 위해 테스트 코드를 작성해보자.

 

 

MockMvc를 설정하고 초기화 시키는 코드는 다음과 같다.

@SpringBootTest
@Transactional
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class MemberControllerTest {

    private MockMvc mockMvc;

    @Autowired
    private WebApplicationContext webApplicationContext;


    @BeforeAll
    public void beforeAll() throws DuplicateException {
        this.mockMvc = MockMvcBuilders
                .webAppContextSetup(webApplicationContext)
                .addFilter(new CharacterEncodingFilter("utf-8", true))
                .build();
    }
    
}
  • SpringBootTest : 테스트를 위한 어노테이션으로 애플리케이션 구동에 필요한 빈들을 주입하고 컨텍스르를 로드함.
  • Transactional : 클래스에 붙여 모든 메서드에 트랜잭션을 적용한다.@SpringBootTest 테스트에 사용하기에 실행한 작업은 롤백된다.
  • TestInstance : @BeforeAll 어노테이션을 non-static하게 사용하기위한 설정으로 https://non-stop.tistory.com/669 참고.
  • MockMvcBuilders로 빌드하는데 CharacterEncoding을 안해주면 로그를 출력해볼때 깨져나오니 필터를 추가해주자.

 

 

이제 회원과 관련된 테스트 코드를 몇 보이겠다.

    @Test
    @DisplayName("정상적인 회원가입")
    void signupMember() throws Exception {

        SignUpMember signUpMember = new SignUpMember();
        signUpMember.setName("새로운닉네임");
        signUpMember.setLoginId("새로운아이디");
        signUpMember.setLoginPwd("새로운비밀번호");

        ObjectMapper objectMapper = new ObjectMapper();
        String testSignUpBody = objectMapper.writeValueAsString(signUpMember);

        ResultActions resultActions = mockMvc.perform(MockMvcRequestBuilders
                .request(HttpMethod.POST, signUpUrl)
                .contentType(MediaType.APPLICATION_JSON)
                .content(testSignUpBody)
                .characterEncoding("utf-8"));

        resultActions
                .andExpectAll(
                        status().isCreated(),
                        jsonPath("$.memberId").exists(),
                        jsonPath("$.name").value(signUpMember.getName()),
                        jsonPath("$.role").value(Role.USER.name()))
                .andDo(print());

    }
  • ObjectMapper로 signUpMember를 JSON으로 변환하여 body에 담았다.
  • request : 요청 메서드와 url을 지정
  • contentType : 컨텐츠 타입 지정
  • content : body에 담을 데이터
  • characterset : 인코딩 방식
  • andExpectAll : 예상하는 결과값을 작성한다.
  • status : 응답의 상태코드
  • jsonPath : json 응답의 키 경로
  • jsonPath().exists: 존재하는가?
  • jsonPath().value : 값이 일치하는가
  • print() : 다음과 같이 요청과 응답을 출력해준다.

print() 요청 상태

 

print() 응답 상태

 

 

이렇게 API의 요청으로 응답을 테스트할 수 있다.

Comments