[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와 비교한다.
'프로젝트 일지' 카테고리의 다른 글
#16. QueryDsl 적용 (0) | 2023.05.24 |
---|---|
#15. Spring RestDocs - GitPage Hosting (0) | 2023.05.19 |
#13. 싱글 프로젝트 일지 - JUnit test : Book 도메인 (0) | 2023.05.17 |
#12. 싱글 프로젝트 일지 - JUnit test : Member 도메인 (2) | 2023.05.17 |
#11. Rest Docs & JUnit 테스트 기초 설정 (0) | 2023.05.16 |