[JUnit Test의 목적]
대상 메서드의 예상되는 결과 데이터인 Dto.ResponseDto 객체의 필드 값들과,
대상 메서드로 mock HTTP 요청의 실제 응답 데이터 (ResultActions) 의 필드 값이 일치하는지 검증
Dto.ResponseDto = ResultActions ? JUnit Passed : JUnit no Passed
[JUnit Test 메서드 작성 순서]
1. 대상 메서드의 본연의 기능이 잘 되는지 확인이 주목적.
2. 대상 메서드에서 사용된 모든 객체의 메서드를 사용한다.
3. 설정해둔 예외 발생 조건은 모두 발생하지 않는다는 가정을 전제로 한다.
[JUnit Test 메서드 로직 구성]
1. postMemberTest()
목적 : 회원 등록이 잘 되는지.
- 로직 구성 -
#1. 실제 메서드에서 파라미터로 libraryId를 받으므로, Long libraryId 변수를 생성
#2. 회원 정보를 포함시킨 Dto.Post 객체를 생성.
#3. 실제 메서드에서 mapper를 사용하여
Dto.Post 객체 -> Member 엔티티로 변경했으므로 given().willReturn() 메서드를 사용.
#4. 실제 메서드에서 memberService.createMember() 메서드를 실행했으므로,
역시 given().willReturn() 메서드를 사용.
#5. 실제 메서드에서는 LibraryMember를 생성하지만, 테스트 목적과 상이하므로 생략.
#6. Dto.Response 객체를 생성하여 postMember() 메서드의 예상되는 결과 값을 생성한다.
#7. 실제 메서드에서 응답으로 mapper를 사용해 Member entity -> Dto.Response 변환하므로,
given().willReturn() 메서드를 사용.
#8. 요청에 대한 응답을 나타내는 ResultActions 객체를 생성.
#9. actions(실제 응답 데이터)와 response를 비교하는 메서드를 사용하여 비교함.
2. getMemberTest()
목적 : 단일 회원 객체를 잘 불러오는가 ?
- 로직 구성 -
#1. 실제 메서드에서 파라미터로 libraryId, memberId를 파라미터로 받으니 Long 타입 변수로 생성.
#2. 회원 정보를 포함시켜 새로운 Member 객체 생성.
#3. 실제 메서드에서 memberService.findMember() 를 사용했으므로 given().willReturn() 사용.
#4. getMember() 메서드의 예상 데이터인 Dto.Response 객체를 생성하여 생성한 Member 객체 정보 set
#5. 실제 메서드에서 mapper를 사용해 Member Entity -> Dto.Response 변환을 했으므로,
똑같이 given().willReturn() 메서드를 사용해줌.
#6. 실제 getMember() 메서드의 요청 결과 데이터인 ResultActions를 생성 후 URL과 HTTP Method 입력
#7. getMember() 메서드의 예상되는 결과 데이터 Dto.Response와 실제 결과 ResultAtions 데이터를 비교.
3. deleteMemberTest()
목적 : 등록된 회원 객체를 삭제.
- 로직 구성 -
#1. 실제 메서드에서 libraryMemberService.findByLibrary_IdAndMember_Id를 사용해
LibraryMember 객체를 생성하고 있으므로, given().willReturn() 메서드 사용.
A. LibraryMember 객체를 생성하여 willReturn()에 입력.
LibraryMember libraryMember = new LibraryMember();
given(libraryMemberService.findByLibrary_IdAndMember_Id
(Mockito.any(Long.class),Mockito.any(Long.class))).willReturn(libraryMember);
B. willReturn() 안에 new LibraryMember() 입력.
given(libraryMemberService.findByLibrary_IdAndMember_Id
(Mockito.any(Long.class),Mockito.any(Long.class))).willReturn(new LibraryMember());
#2. 실제 메서드에는 삭제 요청에 있어서 해당 회원이 미반납한 도서가 있을 경우 삭제 예외 조건이 있지만,
삭제 기능을 확인하는게 목표이므로, 미반납 객체는 없다고하기 위해 List<MemberBook>은 빈 List로 생성.
given(memberBookRepository.findByMember_Id(Mockito.any(Long.class))).willReturn(Collections.emptyList());
#3. 실제 deleteMember() 메서드의 HTTP 요청 결과 데이터를 담는 ResultActions 생성 후
URL + HTTP Method 입력.
#4. actions 데이터와 예상되는 데이터를 비교하는 코드 작성.
4. getRentalHistoryTest()
목적 : 회원의 대여 기록이 있는지 확인 < 대여 기록이 있다고 가정 >
- 로직 구성 -
#1. 실제 메서드에서 memberId를 파라미터로 전달받으므로, Long memberId 변수 생성.
#2. MemberBook 객체 생성.
#3. 실제 메서드에서 List<MemberBook> 객체와 Page<MemberBook> 객체가 있으므로
똑같이 List<MemberBook> 객체 생성하여 memberBook 객체를 추가해줌.
#4. Page<MemberBook> 객체에 List<MemberBook> 객체를 전달해줌.
Page<MemberBook> page = new PageImpl<>(memberBooks);
#5. 실제 메서드에서 memberBookService.findMemberBooksByMemberId 메서드를 사용하여
given().willReturn() 메서드를 사용해줌.
#6. 실제 메서드에서는 List<Dto.Response>가 응답 데이터로 사용하므로
단일 Dto.Response를 생성하고, List<Dto.Response>에 add 해줌.
#7. 실제 메서드에서 memberBookMapper를 사용해 List<Dto.Response>를 반환하므로
given().willReturn() 메서드 사용해줌.
#8. 실제 메서드의 요청에 대한 실제 결과 데이터 ResultActions 객체를 생성하고
URL과 HTTP Method를 입력.
#9. Page 형식 요청이므로 URL에 전달할 page, size를 .param 메서드를 사용하여 전달함.
#10. 메서드로 보낸 요청에 대한 실제 데이터 값인 ResultActions 필드와
메서드의 예상되는 응답 데이터 response를 비교하는 메서드 사용.
#11. .param() 으로 특정 메서드에 요청하는 URL에 같이 넣을 page, size에 대한 설명으로
.requestParameters() 메서드 사용하여 정보를 전달함.
requestParameters(
parameterWithName("page").description("내용이 나오는 페이지"),
parameterWithName("size").description("한 페이지에 나오는 최대 갯수")
)
'프로젝트 일지' 카테고리의 다른 글
#14. 싱글 프로젝트 일지 - JUnit test : Library 도메인 (0) | 2023.05.17 |
---|---|
#13. 싱글 프로젝트 일지 - JUnit test : Book 도메인 (0) | 2023.05.17 |
#11. Rest Docs & JUnit 테스트 기초 설정 (0) | 2023.05.16 |
#10. 싱글 프로젝트 일지 - MemberBook 도메인 (0) | 2023.05.11 |
#9. 싱글 프로젝트 일지 - libraryMember 도메인 (0) | 2023.05.11 |