[02.13] 내일배움캠프[Spring] TIL-70

박상훈·2023년 2월 13일
0

내일배움캠프[TIL]

목록 보기
70/72

[02.13] 내일배움캠프[Spring] TIL-70

1. Spring final Project

  • 오늘 진행한 작업 : 요청한 강좌의 완료 여부를 판단해서, 완료되었을 경우 리뷰를 남길 수 있는 작업 수행
  • 피드백 : 저번에도 나왔지만, Product라는 엔티티의 ProduectService는 ProductRepository를 의존하게 하자
    -> 다른 리파지토리를 접근하는 경우가 생긴다면, 그 해당 서비스를 DI받는 형식으로 간다.


  • 지금 까지는 기본적인 기능이여서 Test코드도 작성하는데 어렵지 않았다.
  • 고민이 되었던 것은, 유저의 엔티티의 속성을 변경하거나 하는 작업을 테스트 하려면 Repository의 테스트 즉 데이터의 입출력을 진짜로 봐야하는데, 그렇게 되면 단위 테스트가 아닌 통합 테스트가 되어버릴 것 같아서,
    기본적인 서비스 코드만 작성했다.

2. TestCode

  • 수강 후기 작성
    @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);
    }
}
  • 리파지토리 딴의 테스트코드는 아직 작성하지 못했지만, 추후 해볼 예정이다!
profile
기록하는 습관

0개의 댓글