본문 바로가기

프로젝트 일지

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

[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("한 페이지에 나오는 최대 갯수")
)