실전 프로젝트 5주차. 오늘은 피드백을 듣고 테스트 코드를 하루종일 작성했다.
유닛 테스트 코드를 작성하려는데 최소 단위 테스트인 유닛 테스트에서 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);
}