230429 TIL #72 Mock 테스트코드 작성

김춘복·2023년 4월 28일
0

TIL : Today I Learned

목록 보기
72/543
post-custom-banner

230429 Today I Learned

실전 프로젝트 5주차. 오늘은 피드백을 듣고 테스트 코드를 하루종일 작성했다.


Mock 테스트코드 작성

유닛 테스트 코드를 작성하려는데 최소 단위 테스트인 유닛 테스트에서 Entity 객체를 만들어서 테스트를 진행하는게 맞는지 의문이 들었다.
그래서 멘토님께 질문을 드려보니 테스트 하려는 클래스를 제외 하고 전부 다 Mock으로 변경해서 유닛테스트를 진행하는 것이 좋다고 답변해주셨다.
그래서 Mock을 사용해서 새로 테스트 코드를 짜봤다.

  • 기본적으로 Mock으로 클래스들을 만든 다음
    When(mock객체의 행동).thenReturn(반환값);
    으로 일일이 mock객체의 행동들을 다 지정해준다.
    그런 다음 테스트 하려는 로직을 when 단에서 실행시키고
    then 단에서 assertEquals로 확인해보면 된다.
    verify는 mock 객체가 몇번 실행됐는지 확인할 수 있다.

  • 테스트 코드 일부

@ExtendWith(MockitoExtension.class)
class ReservationServiceTest {

  //  Test 주체
  @InjectMocks
  ReservationService reservationService;

  @Mock
  ReservationRepository reservationRepository;
  @Mock
  TicketInfoRepository ticketInfoRepository;
  @Mock
  EventRepository eventRepository;
  @Mock
  RedisRepository redisRepository;
  @Mock
  RedisTemplate<String, DetailEventResponseDto> redisTemplate;
  @Mock
  ValueOperations<String, DetailEventResponseDto> valueOperations;

  @Mock
  User testUser;
  @Mock
  Event testEvent;
  @Mock
  TicketInfo testTicketInfo;
  @Mock
  Reservation testReservation;

  @Nested
  @DisplayName("예매중 확인하기 로직 테스트")
  class testVerifyReservation {
    Long testEventId = 123456L;
    Long testTicketInfoId = 123456L;
    String testTitle = "테스트공연 <123>";
    String cacheKey = "DetailEventResponseDto::" + testEventId;

    @Test
    @DisplayName("DB로 공연 조회 테스트")
    void test1() {
//    given
      when(testEvent.getId()).thenReturn(testEventId);
      when(testEvent.getTitle()).thenReturn(testTitle);
      when(testEvent.getTicketInfo()).thenReturn(testTicketInfo);
      when(testTicketInfo.getId()).thenReturn(testTicketInfoId);
      when(eventRepository.findById(testEventId)).thenReturn(Optional.of(testEvent));
//    when
      DetailEventResponseDto result = reservationService.verifyReservation(testEventId);
//    then
      assertEquals(testEventId, result.getEventId());
      assertEquals(testTitle, result.getTitle());
      assertEquals(testTicketInfoId, result.getTicketInfoDto().getTicketInfoId());
      verify(eventRepository, times(1)).findById(testEventId);
    }

    @Test
    @DisplayName("Redis로 공연 조회 테스트")
    void test2(){
//    given
      DetailEventResponseDto mockDto = mock(DetailEventResponseDto.class);
      when(redisTemplate.opsForValue()).thenReturn(valueOperations);
      when(valueOperations.get(cacheKey)).thenReturn(mockDto);
      when(mockDto.getEventId()).thenReturn(testEventId);

//    when
      DetailEventResponseDto result = reservationService.verifyReservation(testEventId);

//    then
      assertEquals(testEventId, result.getEventId());
      verify(eventRepository, never()).findById(testEventId);
    }
  • 전체 테스트 코드는 여기서 확인 가능
profile
Backend Dev / Data Engineer
post-custom-banner

0개의 댓글