에러 상황
- postService에서 create mock 테스트를 하는 중에 발생한 에러입니다.
기존 테스트 코드
@Test
@DisplayName("Post를 작성할 수 있다.")
void create() throws IOException {
Post post = Post.builder()
.id(1L)
.content("새로운 게시글입니다.")
.member(MEMBER)
.build();
MockMultipartFile mockFile = new MockMultipartFile("image", "C-9vgadUAAAKE1w.jpg", ".png",
new FileInputStream(System.getProperty("user.dir") + "/picture/C-9vgadUAAAKE1w.jpg"));
List<MultipartFile> images = List.of(mockFile);
PostImage image = PostImage.builder()
.post(post)
.originalFileName(mockFile.getOriginalFilename())
.serverFileName(UUID.randomUUID() + "." + FilenameUtils.getExtension(mockFile.getOriginalFilename()))
.path(System.getProperty("user.dir") + "/picture/")
.size(mockFile.getSize())
.build();
Map<PostImage, MultipartFile> postImagesMap = Map.of(image, mockFile);
PostResponse.CreateResponse createResponse = new PostResponse.CreateResponse(1L, MEMBER.getId(),
post.getContent());
given(memberGiver.findById(MEMBER.getId())).willReturn(MEMBER_RESPONSE);
given(postConverter.toMember(MEMBER_RESPONSE)).willReturn(MEMBER);
// 문제의 코드
given(postRepository.save(post)).willReturn(post);
given(postConverter.toPostImages(images, post)).willReturn(postImagesMap);
willDoNothing().given(postImageService).save(postImagesMap.keySet());
//when
PostResponse.CreateResponse response = postService.create(MEMBER.getId(), post.getContent(), images);
//then
assertThat(response).isEqualTo(createResponse);
}
문제가 생긴 부분의 postService 코드
Post savedPost = postRepository.save(
Post.builder()
.content(content)
.member(member)
.build()
);
원인
given(postRepository.save(post))
파라미터 post와 실제 service에서 돌아가는 postRepository.save(post)의 파라미터 post가 동등성은 같지만 동일성은 달라서 생기는 오류였습니다.
해결
given(postRepository.save(any())).willReturn(post); // 수정한 코드
- Java 8부터 인수 없는
any
메소드를 사용할 수 있으며 컴파일러에서 type 인수를 유추합니다.
- 즉, 타입만 같다면 인수로 인정 받을 수 있습니다.