📗: 인터페이스, 📄: 클래스
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 데이터
}
- UriComponents: URI를 구성하는 요소들을 분리하여 변수로 저장하여 가진다.
- 📄 UriComponentsBuilder: UriComponents(모두 private)를 Build 할 수 있도록 돕는다.
https://www.baeldung.com/spring-uricomponentsbuilder
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으로 변환한다.
- getResponse: MockHttpServletResponse로 리턴한다.
- 📗 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));
'Back-End > Spring' 카테고리의 다른 글
[Spring Security] 구성 요소 및 인증 과정 (0) | 2022.09.22 |
---|---|
[Spring Security] 웹 요청 처리 흐름, 서블릿 필터와 필터 체인 (0) | 2022.09.22 |
Spring Boot에서 메일 발송하기(Google SMTP) (0) | 2022.09.17 |
[Spring MVC] 애플리케이션 빌드 / 실행 / 배포 (0) | 2022.09.16 |
[Spring Boot] JUnit을 이용하여 테스트 코드 작성하기 (feat. Mockito) (0) | 2022.09.07 |
댓글