- 오늘 진행한 작업 : 요청한 강좌의 완료 여부를 판단해서, 완료되었을 경우 리뷰를 남길 수 있는 작업 수행
- 피드백 : 저번에도 나왔지만, Product라는 엔티티의 ProduectService는 ProductRepository를 의존하게 하자
-> 다른 리파지토리를 접근하는 경우가 생긴다면, 그 해당 서비스를 DI받는 형식으로 간다.
- 지금 까지는 기본적인 기능이여서 Test코드도 작성하는데 어렵지 않았다.
- 고민이 되었던 것은, 유저의 엔티티의 속성을 변경하거나 하는 작업을 테스트 하려면
Repository
의 테스트 즉 데이터의 입출력을 진짜로 봐야하는데, 그렇게 되면 단위 테스트가 아닌 통합 테스트가 되어버릴 것 같아서,
기본적인 서비스 코드만 작성했다.
- 수강 후기 작성
@Test
@DisplayName("수강 후기 작성(MemberService)")
void createReview(){
Long postId = 1L;
Long tutorId = 1L;
Member member = new Member("user@user.com","asd12345","user1");
CreateReviewRequestDto createReviewRequestDto = CreateReviewRequestDto.builder().review_content("굿!").star_rating(3f).build();
given(reviewService.checkTuitionState(1L,member.getId())).willReturn(true);
given(postService.getTutorId(postId)).willReturn(tutorId);
String msg = memberService.createReview(postId,createReviewRequestDto,member);
// verify(reviewRepository,times(1)).save(isA(Review.class));
assertThat(msg).isEqualTo("수강후기 작성이 완료되었습니다!");
}
- ReviewServiceImpl Test
package com.sparta.soomtut.service.impl;
import com.sparta.soomtut.dto.CreateReviewRequestDto;
import com.sparta.soomtut.entity.Review;
import com.sparta.soomtut.entity.TuitionRequest;
import com.sparta.soomtut.enums.TuitionState;
import com.sparta.soomtut.repository.ReviewRepository;
import com.sparta.soomtut.repository.TuitionRequestRepository;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import java.util.Optional;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.BDDMockito.given;
@ExtendWith(MockitoExtension.class)
class ReviewServiceImplTest {
@Mock
TuitionRequestRepository tuitionRequestRepository;
@Mock
ReviewRepository reviewRepository;
@InjectMocks
ReviewServiceImpl reviewService;
@Test
@DisplayName("신청강좌 찾기")
void findTuitionRequest() {
TuitionRequest tuitionRequest = new TuitionRequest(TuitionState.DONE,1L,1L);
given(tuitionRequestRepository.findByPostIdAndTuteeId(anyLong(),anyLong())).willReturn(Optional.ofNullable(tuitionRequest));
TuitionRequest tut = reviewService.findTuitionRequest(1L,1L);
assertThat(tuitionRequest.getPostId()).isEqualTo(tut.getPostId());
}
@Test
@DisplayName("리뷰 저장하기(ReviewServiceImpl)")
void saveReview() {
Review review = new Review(1L,1L,3f,"리뷰");
given(reviewRepository.save(any())).willReturn(review);
Review savedReview = reviewService.saveReview(1L,new CreateReviewRequestDto(3f,"리뷰"),1L);
assertThat(review.getReview_content()).isEqualTo(savedReview.getReview_content());
}
@Test
@DisplayName("완료된 강좌인지 판단하기")
void checkTuitionState() {
TuitionRequest tuitionRequest = new TuitionRequest(TuitionState.DONE,1L,1L);
//given(reviewService.findTuitionRequest(any(),any())).willReturn(tuitionRequest);
tuitionRequest.changeTuitionState();
given(tuitionRequestRepository.findByPostIdAndTuteeId(anyLong(),anyLong())).willReturn(Optional.ofNullable(tuitionRequest));
assertThat(reviewService.checkTuitionState(anyLong(),anyLong())).isEqualTo(true);
}
}
- 리파지토리 딴의 테스트코드는 아직 작성하지 못했지만, 추후 해볼 예정이다!