본문 바로가기

프로젝트 일지

#14. 싱글 프로젝트 일지 - JUnit test : Library 도메인

[JUnit Test의 목적]

대상 메서드의 예상되는 결과 데이터인 Dto.ResponseDto 객체의 필드 값들과,
대상 메서드로 mock HTTP 요청의 실제 응답 데이터 (ResultActions) 의 필드 값이 일치하는지 검증


Dto.ResponseDto = ResultActions ? JUnit Passed : JUnit no Passed

[JUnit Test 메서드 작성 순서]

1. 대상 메서드의 본연의 기능이 잘 되는지 확인이 주목적.
2. 대상 메서드에서 사용된 모든 객체의 메서드를 사용한다.
3. 설정해둔 예외 발생 조건은 모두 발생하지 않는다는 가정을 전제로 한다.

 

[JUnit Test 메서드 로직 구성]

1. getMembersTest()

목적 : 도서관에 등록된 전체 회원 조회

- 로직 구성 -

## 실제 메서드의 로직 흐름대로 객체 생성 ##
#1. 실제 메서드에서 파라미터로 받는 libraryId를 Long 변수로 생성
#2. 초기 Member 객체 생성하여 libraryId, memberId 및 회원 정보 설정.
#3. LibraryMember 객체 생성하고 Member 객체 할당
#4. List<LibraryMember> 객체 생성하고 생성해둔 libraryMember 객체 할당.
#5. List<LibraryMember> 객체를 전달하여 Page<LibraryMember> 객체 생성.

List<LibraryMember> libraryMembers = new ArrayList<>();
libraryMembers.add(libraryMember);
Page<LibraryMember> libraryMemberPage = new PageImpl<>(libraryMembers);

#6. 실제 메서드에서 List<Dto.Response>를 응답으로 전달하므로, 단일 Dto.Response 객체 생성함.
#7. 생성한 Dto.Response 객체에 예상되는 응답 필드 값을 할당함.
#8. List<Dto.Response>에 생성해둔 Dto.Response 객체 전달함.
#9. given().willReturn() 사용하여 libraryMemberMapper 메서드 구현.
#10. 실제 해당 메서드의 응답 데이터 ResultActions 생성 후 url과 page, size 를 .param으로 입력.
#11. 대상 메서드로의 HTTP 요청 이후 응답 예상 Dto.Response와
실제 HTTP 요청의 결과를 담은 ResultAction 내용이 동일한지 비교.
#12. 실제 메서드에서 MultiResponse를 사용하므로 .andExpect() 메서드에는 단일 필드가 아닌 

.andExpect(jsonPath("$.data[0].libraryId").value(response.getLibraryId()))

인덱스로 데이터를 입력하고 response와 비교한다.

 

2. getBooksTest()

목적 : 도서관에 보관중인 전체 도서 목록 조회

- 로직 구성 -

## 실제 메서드의 로직 흐름대로 객체 생성 ##
#1. 새로운 Book 객체 및 Library 객체를 생성
#2. 도서관에 보관중인 책 LibraryBook 객체 생성하고 Book, Library 객체를 할당함.
#3. 생성한 LibraryBook 객체의 상태를 임의로 AVAILABLE 로 설정.
#4. 실제 메서드에서 리스트 조회가 목적이므로 List<LibraryBook> 객체 생성하고 LibraryBook 추가.
#5. Page<LibraryBook> 객체 생성하여 List<LibraryBook> 객체를 전달해줌.

LibraryBook libraryBook = new LibraryBook();
List<LibraryBook> libraryBooks = new ArrayList<>();
libraryBooks.add(libraryBook);

Page<LibraryBook> libraryBookPage = new PageImpl<>(libraryBooks);

#6. 실제 메서드에서 요청을 받았을 때 나올법한 결과 데이터를
LibraryBookDto.Response 객체를 생성하여 값을 할당해줌.
#7. List<LibraryBookDto.Response> 객체 생성하여 LibraryBookDto.Response 객체를 할당.
#8. 실제 메서드에서 사용한 libraryBookMapper 메서드를 given().willReturn() 으로 사용
#9. 대상 메서드로의 요청에 실제 결과 데이터 ResultActions 생성하고 url과 page, size 입력.
#10. MultiResponse를 사용하고 있으므로

.andExpect(jsonPath("$.libraryId").value(response.getLibraryId()))

위와 같이 단일 필드 실제 결과 데이터 actions와 response와 비교하는게 아니라, 아래와 같이

.andExpect(jsonPath("$.data[0].libraryId").value(response.getLibraryId()))

data[i] 형식으로 인덱스별로 데이터와 필드를 포함하여 우리의 예상 결과 데이터 response와 비교한다.