코드 그라데이션

20230210 테스트 코드 추가 설명 (3) 프로필 정보 조회 성공 테스트 본문

Spring/Test Code

20230210 테스트 코드 추가 설명 (3) 프로필 정보 조회 성공 테스트

완벽한 장면 2023. 2. 16. 01:48

UserService

  public interface UserService {
  
   ProfileResponseDto showProfile(Long profileId);

}

UserServiceImpl

@Service
@RequiredArgsConstructor

public class UserServiceImpl implements UserService { // UserServiceImpl로 수정 부탁드립니다.


  private final UserRepository userRepository;
  private final JwtUtil jwtUtil;
  private final PasswordEncoder passwordEncoder; 
  
   @Override
  public ProfileResponseDto showProfile(Long userId) {
    Profile profile = userRepository.findById(userId)
        .orElseThrow(() -> new IllegalArgumentException("회원 없음")).getProfile();
    return new ProfileResponseDto(profile);
  }
 
 
}

 

다시 회원정보 업데이트 성공 테스트 코드 그대로 가져와서 틀을 따보자

@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());
 }
}

 

한땀 한땀 받아적으면서 다시 틀 짜보기

JPA는 데이터베이스에 Primary Key만 있으면, 해당 row를 특정할 수가 있잖아요.

(우리가 주민등록번호 알면 사람을 특정할 수 있는 것처럼)

그럼 바꾸는 것도 아니고 조회만 하는 것이기 때문에 아이디만 가져오면 되고,

// 업데이트할 사용자의 프로필 정보 부분이 필요가 없다.

 

그런데 얘도 결국 데이터베이스에 저장된 값을 가져오는 메서드이기 때문에

// 데이터베이스에 저장되어 있는 사용자 역할 부분 은 필요하다!

 

그리고 얘 역시 findById를 사용하니까

given(userRepository.findById(userId).willReturn(Optional.of(user)); 이 부분도 그대로 살려둔다.

 

업데이트처럼 뭔가 수정을 위한 복잡한 코드가 필요한 것이 아니라, 그냥 단순히 이 값이 ProfileResponseDto에 잘 갔는지만 확인하면 된다.

newNickname을 그냥 nickName으로 리펙토링하자. 헷갈리잖아.

 

그리고 이 responseDto.getNickname()이 데이터베이스에서 그대로 가져오는 값과 같으면 되니까(요청한 값 아님)

user닉네임과 같으면 되겠죠. img_url도 마찬가지

 

@ExtendWith(MockitoExtension.class)
class UserServiceImplTest {

@Mock
UserRepository userRepository;

@InjectMocks
UserServiceImple userService;

 @Test
 @DisplayName("회원정보 조회 성공 테스트")
 void showProfile() {
 
 //given
  Long userId = 1L; // 데이터베이스에 저장되어 있는 사용자의 primary key
  
  // 데이터베이스에 저장되어 있는 사용자의 역할
  User user = new User("testUser", "1234", new Profile("banana", "before"));
  
  given(userRepository.findById(userId).willReturn(Optional.of(user));
  
  //when
  ProfileResponseDto responseDto = userService.showProfile(userId);

  
  
  //then
  assertThat(responseDto.getNickname()).isEqualTo(user.getProfile().getNickname());
  assertThat(responseDto.getImg_url()).isEqualTo(requestDto.getProfile().getImg_url());
 }
}

 

728x90
Comments