배경
이전에 언급한 MultipartFile 처리와 연결되는 이슈다.
[트러블 슈팅] - MultipartFile 예외 처리
배경 프로젝트에서 게시글 작성 시 이미지를 첨부하는 기능을 추가했다. 이미지는 MultipartFile의 형태로, 프론트로부터 받아왔다. 기존 게시글 작성 메서드에 매개변수로 MultipartFile을 추가했고,
hojunking.tistory.com
이미지 첨부 기능을 추가하면서, 게시물을 작성하는 create 메소드에 MultipartFile을 매개변수로 추가되었다.
create 메소드에 대한 기존 테스트 케이스는 이미지 첨부 기능 이전에 작성하였기에 수정이 필요했다.
문제 상황
이전에 작성한 글에 나오는 이슈와 마찬가지로 null 값을 매개변수로 전달하는 방식을 시도했다.
그러나, 게시물 작성 메소드 create는 multipartFile.isEmpty()를 통해 경우를 구분하고 있었다.
@Transactional
public RsData<Post> create(PostRequest postRequest, Member member, MultipartFile multipartFile) {
if (member == null) {
return RsData.of("F-1", "존재하지 않는 회원입니다.");
}
Post post = new Post(postRequest, member.getId(), new ArrayList<>());
if (!multipartFile.isEmpty()) {
AmazonS3Dto amazonS3ImageDto = imageService.saveImageOnServer(multipartFile, post);
Image image = new Image(amazonS3ImageDto, multipartFile, post);
post.addImage(image);
}
postRepository.save(post);
return RsData.of("S-1", "질문 등록이 완료되었습니다.", post);
}
따라서 null.isEmpty() 를 시도한 형태가 되었고, 당연하게도 NullPointException이 발생했다.
테스트 전용 이미지를 프로젝트에 넣는 것은 바람직하지 않다고 생각했다.
또한, 테스트 전용 메소드를 작성하는 것도 바람직하지 않다고 생각했다.
이를 해결하기 위해 null 이 아니면서, isEmpty() = true를 반환하는 MultipartFile 을 만들어야 했다.
해결
검색을 통해 MockMultipartFile을 활용하는 방법을 찾았다.
기존 create 메소드를 고치는 방법이 존재할 것이라 생각이 들었지만,
단기간에 해결을 해야했고, 해결 방법이 바로 떠오르지 않아서 MockMultipartFile 을 사용했다.
기존 코드
@Test
@DisplayName("게시글 작성 테스트(구매자 회원)")
void createTest() {
// WHEN
Post post = postService.create(postRequest, buyer, null).getData();
// THEN
assertTrue(postRepository.findById(post.getId()).isPresent());
assertThat(postRepository.findById(post.getId()).get().getPosterId()).isEqualTo(buyer.getId());
assertThat(postRepository.findById(post.getId()).get().getTitle()).isEqualTo(postRequest.getTitle());
assertThat(postRepository.findById(post.getId()).get().getContent()).isEqualTo(postRequest.getContent());
}
수정 후 코드
@Test
@DisplayName("게시글 작성 테스트(구매자 회원)")
void createTest() {
// GIVEN
MockMultipartFile emptyFile = new MockMultipartFile("imageFile", new byte[0]);
// WHEN
Post post = postService.create(postRequest, buyer, emptyFile).getData();
// THEN
assertTrue(postRepository.findById(post.getId()).isPresent());
assertThat(postRepository.findById(post.getId()).get().getPosterId()).isEqualTo(buyer.getId());
assertThat(postRepository.findById(post.getId()).get().getTitle()).isEqualTo(postRequest.getTitle());
assertThat(postRepository.findById(post.getId()).get().getContent()).isEqualTo(postRequest.getContent());
}
알아본 바로는, 테스트를 위한 가짜 이미지 객체(MockMultipartFile)를 만들어 사용하는 방식이라고 한다.
객체를 생성할 때, isEmpty() = true 를 반환하도록 적절한 값을 매개변수에 넣었다.
이를 통해 이미지를 첨부하지 않은 상황에 대한 테스트가 가능해졌다.
'프로젝트 > 팀 프로젝트 - MyPill' 카테고리의 다른 글
Ncloud 크레딧 사용 후기 (0) | 2023.07.27 |
---|---|
[리팩토링] @NotNull vs @Column(nullable = false) (0) | 2023.07.22 |
[트러블 슈팅] - MultipartFile 예외 처리 (0) | 2023.07.20 |
[개선 작업] @Value → @ConfigurationProperties (0) | 2023.07.20 |