코드 그라데이션
20230210 테스트 코드 추가 설명 (2) 회원 정보 업데이트 실패 테스트 본문
원본 소스 코드
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 // 예외가 터진 인스턴스가 무엇인지 적어준다.
}
'Spring > Test Code' 카테고리의 다른 글
230217 BoardServiceImpl 테스트 코드 (1) 게시글 생성 - 비교 (0) | 2023.02.26 |
---|---|
230217 Service단 TestCode 전후 비교 (0) | 2023.02.26 |
20230210 테스트 코드 추가 설명 (4) 프로필 정보 조회 실패 테스트 (0) | 2023.02.16 |
20230210 테스트 코드 추가 설명 (3) 프로필 정보 조회 성공 테스트 (0) | 2023.02.16 |
20230210 테스트 코드 추가 설명 (1) 회원 정보 업데이트 성공 테스트 (0) | 2023.02.15 |