반응형
단위별 테스트 작성
저번 글과 이어서 이번에는 Service 계층에 테스트를 진행시켜보도록 하겠다.
package com.example.service.prag.user.service;
import com.example.service.prag.user.domain.User;
import com.example.service.prag.user.domain.UserRepository;
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.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class UserServiceTest {
@Mock
private UserRepository userRepository;
@InjectMocks
private UserService userService;
@Test
public void findUserByEmail(){
User user = User.builder()
.userName("Taehwan") // user_name 필드 추가
.userEmail("Taehwan@gmail.com") // user_email 필드 추가
.userPassword("password") // user_password 필드 추가
.build();
}
@Test
public void findUserByEmai2() {
// 테스트할 사용자 객체 생성
User user = User.builder()
.userName("Taehwan")
.userEmail("Taehwan@gmail.com")
.userPassword("password")
.build();
// userRepository.findByUserEmail 호출 시 반환값 설정
when(userRepository.findByUserEmail("Taehwan@gmail.com")).thenReturn(user);
// 서비스 메서드 호출
User foundUser = userService.findByUserEmail("Taehwan@gmail.com");
// 검증
assertNotNull(foundUser);
assertEquals("Taehwan", foundUser.getUserName());
assertEquals("Taehwan@gmail.com", foundUser.getUserEmail());
assertEquals("password", foundUser.getUserPassword());
// userRepository.findByUserEmail 메서드가 한 번 호출되었는지 검증
verify(userRepository, times(1)).findByUserEmail("Taehwan@gmail.com");
}
@Test
public void findByUserNameAndCreatedAtTest(){
User user = User.builder()
.userName("Taehwan")
.userEmail("Taehwan@gmail.com")
.userPassword("password")
.build();
User user2 = User.builder()
.userName("Taehwan")
.userEmail("Taehwan2@gmail.com")
.userPassword("password2")
.build();
List<User> users = List.of(user2,user);
String name = "Taehwan";
LocalDateTime createdAt=LocalDateTime.now();
when(userRepository.findByUserNameAndCreatedAt(name,createdAt)).thenReturn(users);
List<User> result = userService.findByUserNameAndCreatedAt(name,createdAt);
assertNotNull(result);
assertEquals("Taehwan", result.get(0).getUserName());
// assertEquals("Taehwan@gmail.com", result.get(0).getUserEmail());
// userRepository.findByUserEmail 메서드가 한 번 호출되었는지 검증
verify(userRepository, times(1)).findByUserNameAndCreatedAt(name,createdAt);
}
}
저번 Repository테스트와 다르게 이번에는
@ExtendWith(MockitoExtension.class)
이 구문과
@Mock
private UserRepository userRepository;
@InjectMocks
private UserService userService;
Mock의 개념이 들어가는데 이것은 하나의 계층에서 다른 계층의 의존성을 Mock 가짜 객체로 변환시켜서 단일의 기능을 테스트하기 위함이다.
테스트의 로직은 비슷하지만,
when(userRepository.findByUserEmail("Taehwan@gmail.com")).thenReturn(user);
아래와 같이 when을 통해서 Mock객체가 어떤 메서드를 어떤 매개변수를 통해서 실행했는지를 확인하고, 결과 값을 미리 만들어서 thenReturn에 넣어주면
userRepository가 실제 동작하는 것처럼 결과를 예측할 수 있다.
User foundUser = userService.findByUserEmail("Taehwan@gmail.com");
// 검증
assertNotNull(foundUser);
assertEquals("Taehwan", foundUser.getUserName());
assertEquals("Taehwan@gmail.com", foundUser.getUserEmail());
assertEquals("password", foundUser.getUserPassword());
그 동작한 결과와 비교를 하여 service의 메서드를 실행시켜 결과를 확인한다.
verify(userRepository, times(1)).findByUserEmail("Taehwan@gmail.com");
실제 메서드가 몇번 호출되었는지 확인할 수 있다.
반응형
'Spring > Test' 카테고리의 다른 글
태태개발일지 - Controller계층 Test (0) | 2024.06.09 |
---|---|
태태개발일지 -TestCode 편 (0) | 2024.06.09 |