프로그래밍/spring

테스트 코드에 MultipartFile 사용하는 방법 (파일 테스트 코드)

승민아 2024. 3. 10. 16:04

테스트 코드를 작성하며 실제로 업로드한 파일이 서버와 디스크에 저장되는지 확인할 필요가 있었다.

 

다음 메서드를 호출하여 정상적으로 파일이 저장되길 원한다.

public Location addLocation(Location location, List<MultipartFile> files)

 

List<MultipartFile>은 어떻게 생성해서 넘거야할까?

 

다음과 같이 MockMultipartFile을 사용하여 MultipartFile을 대체할 수 있다.

String imgName1 = "abc1.jpg";
String imgName2 = "abc2.jpg";

MockMultipartFile file1 = new MockMultipartFile(imgName1, imgName1, MediaType.IMAGE_JPEG_VALUE, "img".getBytes());
MockMultipartFile file2 = new MockMultipartFile(imgName2, imgName2, MediaType.IMAGE_JPEG_VALUE, "img".getBytes());

List<MultipartFile> files = new ArrayList<>();
files.add(file1);
files.add(file2);

 

MockMultipartFile의 생성자는 다음과 같다.

 

addLocation 메서드에는 MockMultipartFile을 통해 파일을 생성해서 저장하는 로직이 포함되어 있다.

 

파일이 생성되었는지 확인하고 삭제하는 과정은 File을 통해 경로를 넣어

exists, delete 메서드를 활용할 수 있다.

File file = new File("경로");

if(file.exists())
    file.delete();
else
    throw new FileNotFoundException();

 

 

장소 등록시 함께 넘긴 이미지 파일은

파일 생성이 되었는지 확인하고 삭제하는 과정을 테스트 코드에 포함했다.

    @Test
    @DisplayName("Location 등록")
    void addLocation() throws IOException {

        //given
        String title = "테스트 장소";
        Double longitude = 1.1;
        Double latitude = 2.2;
        String address = "주소";
        String description = "설명";

        Location location = new Location();
        location.setTitle(title);
        location.setLongitude(longitude);
        location.setLatitude(latitude);
        location.setAddress(address);
        location.setDescription(description);

        String imgName1 = "abc1.jpg";
        String imgName2 = "abc2.jpg";

        MockMultipartFile file1 = new MockMultipartFile(imgName1, imgName1, MediaType.IMAGE_JPEG_VALUE, "img".getBytes());
        MockMultipartFile file2 = new MockMultipartFile(imgName2, imgName2, MediaType.IMAGE_JPEG_VALUE, "img".getBytes());
        List<MultipartFile> files = new ArrayList<>();
        files.add(file1);
        files.add(file2);

        //when
        locationService.addLocation(location, files);

        //then
        Location findLocation = locationRepository.findById(location.getId())
                .orElseThrow(() -> new NoSuchElementException());
        List<LocationImage> locationImages = locationImageRepository.findByLocationId(findLocation.getId());

        Assertions
                .assertThat(findLocation.getTitle())
                .isEqualTo(title);
        Assertions
                .assertThat(findLocation.getLongitude())
                .isEqualTo(longitude);
        Assertions
                .assertThat(findLocation.getLatitude())
                .isEqualTo(latitude);
        Assertions
                .assertThat(findLocation.getAddress())
                .isEqualTo(address);
        Assertions
                .assertThat(findLocation.getDescription())
                .isEqualTo(description);

        Assertions
                .assertThat(locationImages.size())
                .isEqualTo(2);

        for (LocationImage locationImage : locationImages) {
            File file = new File(imageStore.getLocationImgFullPath(locationImage.getStoreFileName()));

            if(file.exists())
                file.delete();
            else
                throw new FileNotFoundException();
        }

    }