본문 바로가기
TIL

[231228] service 테스트에서의 MultipartFile

by 진진리 2023. 12. 28.
728x90
프로필 수정 API를 구현한 뒤 서비스단의 테스트 코드를 작성하는 과정에서 매개변수로 MultipartFile 타입을 받아야 했다.
MultipartFile 타입의 매개변수를 가지고 테스트 코드를 작성하는 것이 처음이었기 때문에 이번 기회에 정리해두려고 한다.

 

 

테스트 대상: Service의 updateProfile()

    @Override
    public UserUpdateProfileRes updateProfile(UserUpdateProfileReq req, MultipartFile multipartFile) {

        UserValidator.validate(req);
        User savedUser = getUser(req.getUserId());

        String imageUrl = savedUser.getProfileImageUrl();
        if (!imageUrl.equals(DEFAULT_PROFILE_IMAGE_URL)) {
            s3Util.deleteFile(imageUrl, FilePath.PROFILE);
        }
        if (multipartFile.isEmpty()) {
            imageUrl = DEFAULT_PROFILE_IMAGE_URL;
        } else {
            S3Validator.isProfileImageFile(multipartFile);
            imageUrl = s3Util.uploadFile(multipartFile, FilePath.PROFILE);
        }

        userRepository.save(
                User.builder()
                        .userId(savedUser.getUserId())
                        .username(req.getUsername())
                        .password(passwordEncoder.encode(req.getPassword()))
                        .email(savedUser.getEmail())
                        .introduce(req.getIntroduce())
                        .profileImageUrl(imageUrl)
                        .provider(savedUser.getProvider())
                        .role(savedUser.getRole())
                        .build());

        return new UserUpdateProfileRes();
    }

 

 

테스트 코드: updateProfileTest

  • 이미지 준비
    • resources > images > 테스트에 사용할 이미지 파일 저장
    • ClassPathResource("이미지 경로")를 이용해 경로에 있는 이미지 파일을 읽어올 수 있다.
  • MockMultipartFile("controller에서 MultipartFile을 받을 때의 name", "파일 이름", "파일 타입", InputStream)
  • 이렇게 생성한 multipartFile을 req와 함께 service에 넘겨준다.
@Test
    @DisplayName("프로필 수정")
    void updateProfileTest() throws IOException {
        // given
        UserUpdateProfileReq req =
                UserUpdateProfileReq.builder()
                        .userId(TEST_USER_ID)
                        .username(TEST_ANOTHER_USER_NAME)
                        .password(TEST_ANOTHER_USER_PASSWORD)
                        .introduce(TEST_ANOTHER_USER_INTRODUCE)
                        .build();

        String imageUrl = "images/image1.jpg";
        Resource fileResource = new ClassPathResource(imageUrl);

        MultipartFile multipartFile =
                new MockMultipartFile(
                        "image", fileResource.getFilename(), "image/jpeg", fileResource.getInputStream());

        // 이하 생략
    }