코드 그라데이션

20230210 테스트 코드 추가 설명 (2) 회원 정보 업데이트 실패 테스트 본문

Spring/Test Code

20230210 테스트 코드 추가 설명 (2) 회원 정보 업데이트 실패 테스트

완벽한 장면 2023. 2. 15. 09:26

원본 소스 코드

UserService

  public interface UserService {
  
   Profile updateProfile(Long profileId, ProfileRequestDto request);

}

UserServiceImpl

@Service
@RequiredArgsConstructor

public class UserServiceImpl implements UserService { 

  private final UserRepository userRepository;
  private final JwtUtil jwtUtil;
  private final PasswordEncoder passwordEncoder;
  
    @Override
  public Profile updateProfile(Long userId, ProfileRequestDto request) {
    Profile profileSaved = userRepository.findById(userId)
        .orElseThrow(() -> new IllegalArgumentException("회원 없음")).getProfile();
    profileSaved.update(request.getNickname(), request.getImg_url());
    return ProfileSaved;
  }

 

 

[다시 한땀 한땀 적으면서 코딩하기] 2) 회원정보 수정 실패 테스트

- 성공과 거의 비슷하겠지, 메서드명만 살짝 바꿔준다.

먼저 회원정보 성공 테스트 코드 그대로 가져옴

@ExtendWith(MockitoExtension.class)
class UserServiceImplTest {

@Mock
UserRepository userRepository;

@InjectMocks
UserServiceImple userService;

 @Test
 @DisplayName("회원정보 업데이트 성공 테스트")
 void updateProfile() {
 
 //given
  Long userId = 1L; // 데이터베이스에 저장되어 있는 사용자의 primary key
  
  // User user = new User("testuser", "1234", "01012345678", "서울"); 이게 아니고,
  
  // 데이터베이스에 저장되어 있는 사용자의 역할
  User user = new User("testUser", "1234", new Profile("banana", "before"));
  
  // 업데이트할 프로필의 정보 : 업데이트가 제대로 일어났다면 실행했을 때 닉네임과 imgurl이 바뀌어 있겠지
  ProfileRequestDto requestDto = ProfileRequestDto.builder().nickName("Apple").img_url("after").build();
  
  given(userRepository.findById(userId).willReturn(Optional.of(user));
  
  //when
  // 이거 삭제 userService.updateProfile(userId, requestDto);
  Profile updatedProfile = userService.updateProfile(userId, requestDto);
  // 이렇게 되면 우리가 업데이트된 프로필 정보를 받아서 확인할 수 있게 된다.
  
  
  //then
  Profile updatedProfile = user.getProfile();
  assertThat(updatedProfile.getNickname()).isEqualTo(requestDto.getNickname());
  assertThat(updatedProfile.getImg_url()).isEqualTo(requestDto.getImg_url());
 }
}

 

조금 달라진 것, 회원 정보가 없다고 해야하므로

회원이 있는지 없는지를 알려주는 부분이 UserServiceImpl 부분에서는

Profile profileSaved = userRepository.findById(userId); 이다.

 

userRepository.findById(userId);  얘가 말하기를 "사용자가 없다" 라고 하면 그 때 예외를 던지게 하면 된다.

그 부분이 테스트코드 회원정보 수정 성공 테스트에서는

given(userRepository.findById(userId).willReturn(Optional.of(user)); 이건데...

두 가지 방법이 있다. 던져버리거나,

given(userRepository.findById(userId).willThrow(Optional.of(user));

없다고 하는 메시지를 반환하면 된다.

(아까는 메서드를 실행해서 들어오면 무조건 사용자를 줘라 라고 했는데, 지금은 뭐가 들어오면 무조건 없다고 하라는 것)

given(userRepository.findById(userId).willReturn(Optional.empty());

 

이랬을 때 우리가 기대하는 건 이 메서드가 정상적으로 끝나는 게 아니라, IlegalArgumentException이 터지는 것.

 

그럼 when 과 then이 붙어있는데, 

userService.updateProfile(userId, requestDto) 가 실행되었을 때 IlegalArgumentException이 터진다.

이건 assertThatThrownBy라는 걸로 써준다.

@ExtendWith(MockitoExtension.class)
class UserServiceImplTest {

@Mock
UserRepository userRepository;

@InjectMocks
UserServiceImple userService;

 @Test
 @DisplayName("회원정보 업데이트 실패 테스트 : 회원 정보가 없는 경우")
 void updateProfile() {
 
 //given
  Long userId = 1L; // 데이터베이스에 저장되어 있는 사용자의 primary key
  
  // User user = new User("testuser", "1234", "01012345678", "서울"); 이게 아니고,
  
  // 데이터베이스에 저장되어 있는 사용자의 역할
  User user = new User("testUser", "1234", new Profile("banana", "before"));
  
  // 업데이트할 프로필의 정보 : 업데이트가 제대로 일어났다면 실행했을 때 닉네임과 imgurl이 바뀌어 있겠지
  ProfileRequestDto requestDto = ProfileRequestDto.builder().nickName("Apple").img_url("after").build();
  
  given(userRepository.findById(userId).willReturn(Optional.empty()); // 정보 없으므로 empty() 값으로 바꿔주었다.
  
  
  //when, then
  assertThatThrownBy(() -> {
  //when
  	userService.updateProfile(userId, requestDto); // 예외가 터질 코드를 중괄호 안에 넣어주고
 }).isInstanceOf(IllegalArgumentException.class); // then // 예외가 터진 인스턴스가 무엇인지 적어준다.
}

 

마지막으로 수정하자면 데이터베이스에 사용자 정보가 없으므로

  // 데이터베이스에 저장되어 있는 사용자의 역할 이 부분을 날려도 됨.

@ExtendWith(MockitoExtension.class)
class UserServiceImplTest {

@Mock
UserRepository userRepository;

@InjectMocks
UserServiceImple userService;

 @Test
 @DisplayName("회원정보 업데이트 실패 테스트 : 회원 정보가 없는 경우")
 void failsupdateProfile() {
 
 //given
  Long userId = 1L; // 데이터베이스에 저장되어 있는 사용자의 primary key
    
  // 업데이트할 프로필의 정보 : 업데이트가 제대로 일어났다면 실행했을 때 닉네임과 imgurl이 바뀌어 있겠지
  ProfileRequestDto requestDto = ProfileRequestDto.builder().nickName("Apple").img_url("after").build();
  
  given(userRepository.findById(userId).willReturn(Optional.empty()); // 정보 없으므로 empty() 값으로 바꿔주었다.
  
  
  //when, then
  assertThatThrownBy(() -> {
  //when
  	userService.updateProfile(userId, requestDto); // 예외가 터질 코드를 중괄호 안에 넣어주고
 }).isInstanceOf(IllegalArgumentException.class); // then // 예외가 터진 인스턴스가 무엇인지 적어준다.
}

 

728x90
Comments