본문 바로가기
Back-End/Spring

[Spring Boot] JUnit으로 단위 테스트(Unit Test) 코드 작성하기

by 달의 조각 2022. 9. 18.
📗: 인터페이스, 📄: 클래스

 

helper
  ㄴ 📗 ControllerTestHelper : HttpMethod에 따라 요청 메서드 생성, URI 반환
  ㄴ 📗 MemberControllerTestHelper : Member 컨트롤러에 대한 URI를 호출할 수 있도록 연결
  ㄴ 📄 StubData : Map으로 HttpMethod에 따라 Dto 객체를 생성하여 반환

controllerTest
  ㄴ 📄 MemberControllerTest : helper를 활용하여 테스트 수행

단위 테스트 코드를 작성할 때 아래 두 가지의 라이브러리가 사용된다.

  • JUnit5: 자바 단위 테스트를 위한 테스팅 프레임워크
  • AssertJ: 자바 테스트를 돕기 위해 다양한 문법을 지원하는 라이브러리

단위 테스트는 given - when - then 패턴으로 작성할 수 있다.

 


요청 데이터 설정 - given

 

  • 📗 RequestBuilder: HttpRequestMessage 개체를 생성하는 데 사용된다.
  • 📄 MockMvcRequestBuilders: RequestBuilder를 만드는 데 사용할 수 있는 정적 메서드를 제공한다.
    RequestBuilder의 static 팩토리 메서드
    post, patch, get, delete, put의 요청 방식을 지정할 수 있고, MockHttpServletRequestBuilder을 반환한다.
  • 📄 MockHttpServletRequestBuilder: 요청 정보를 설정할 수 있도록 한다.
//RequestBuilder: HttpRequestMessage 개체를 생성하는 데 사용된다
default RequestBuilder postRequestBuilder(URI uri, String content) {

    //RequestBuilder를 만드는 데 사용할 수 있는 정적 메서드를 제공한다
    return MockMvcRequestBuilders
            .post(uri)
            .accept(MediaType.APPLICATION_JSON) //클라이언트 쪽이 응답 데이터 타입
            .contentType(MediaType.APPLICATION_JSON) //서버 쪽에서 처리 가능한 타입
            .content(content); //request body 데이터
}

 

default URI createURI(String url, long resourceId) {

    //UriComponentsBuilder: 여러 개의 파라미터를 이용하여 URI을 작성할 때 편리하다
    //buildAndExpand: UriComponents를 빌드 하고 최종 링크를 생성한다 매개변수를 제공할 수 있다
    //toUri: 전체 경로 URI를 반환한다
    return UriComponentsBuilder.newInstance().path(url).buildAndExpand(resourceId).toUri();
}

 

🍹 Mockito

슬라이스 테스트는 한 계층 내에서만 이루어져야 하므로 다른 계층의 로직은 Mockito를 이용한다. 가짜 객체를 주입하여 어떤 결과를 반환하라고 정해진 답변을 준비시킨다.

  • given: Mock 객체가 특정 값을 리턴 하는 동작을 지정한다.
  • willReturn: 동작이 리턴 할 Stub 데이터이다.
//updateMember의 동작 결과가 어떠한 Member이든 결과가 Member여야 한다
given(memberService.updateMember(Mockito.any(Member.class))).willReturn(new Member());

 

  • doNothing(): void 메서드에서 직관적인 검증을 할 수 있도록 한다.
  • when(): Mock 객체에 특정 조건을 지정한다.
doNothing().when(memberService).deleteMember(memberId);

 


요청 데이터 전송

when

 

  • 📄 MockMvc: HTTP 서버를 시작할 필요 없이 컨트롤러를 테스트할 수 있는 Spring Boot 테스트 도구 클래스
    • perform(ReuqestBuilder rb): 요청을 수행하고 결과에 대한 검증을 이어갈 수 있는 유형을 반환한다.
//when
ResultActions actions = mockMvc.perform(patchRequestBuilder(uri, content));

 


검증

then

 

  • 📗 MvcResult: 요청에 대한 결과에 접근한다.
    • getResponse: MockHttpServletResponse로 리턴한다.
      • getContentAsString: String으로 변환한다.
  • 📗 ResultActions
    • andDo: 어떤 동작을 수행한다.
    • andExpect: 결과값을 예상한다.
    • andReturn: 요쳥 결과를 MvcResult 타입으로 리턴한다.
//then
actions.andExpect(status().isOk())
        .andExpect(jsonPath("$.data.phone").value(patch.getPhone()));

 

 

📄 MockMvcResultMatchers

  • jsonPath: JSON 객체를 탐색하기 위한 표준화된 방법
    • parse: 여러 입력 타입에 따라 JSON을 읽는 정적 메서드
    • read: XPath 표현식을 읽고 해당 데이터 추출
List list = JsonPath.parse(result.getResponse().getContentAsString()).read("$.data");
assertThat(list.size(), is(2));

댓글