현재까지 개발하면서 스웨거를 통해서만 테스트를 했다. api를 통해서만 테스트를 하다 보니, 기능 하나하나에 대한 신뢰도가 떨어지고 시간이 갈 수록 기억이 나지 않게되면서 테스트를 통한 문서화도 필요하다고 생각했다.
어노테이션
@MOCK
: 단위테스트를 할 때 쓰이는 어노테이션으로 의존성이 필요한 클래스를 테스트할 때 가짜 객체를 넣어주는 것이다.
실제 객체의 행동을 흉내내는 것으로 when()이나 doReturn() 등의 설정을 통해 원하는 동작을 정의할 수 있다.
@SPY
: 실제 객체를 사용할 수 있게 하는 어노테이션이다. 다만 일부 메서드를 mock처럼 원하는 동작을 할 수 있게 끔 설정해줄 수 있다.
@ExtendWith(MockitoExtension.class)
: Junit5에서 mockito를 사용할 수 있도록 해주는 어노테이션
서비스 테스트 코드
@ExtendWith(MockitoExtension.class)
public class ImageServiceTest {
@InjectMocks
ImageServiceImpl imageService;
@Mock
ImageRepository imageRepository;
@Mock
private Market market;
@TempDir
Path tempDir;
private String uploadFolder;
@BeforeEach
void setUp() {
uploadFolder = tempDir.toString() + "/";
ReflectionTestUtils.setField(imageService, "uploadFolder", uploadFolder);
}
@Test
@DisplayName("이미지 저장 테스트")
public void saveImageListTest() throws Exception{
// given
List<MultipartFile> multipartFileList = new ArrayList<>();
MockMultipartFile file1 = new MockMultipartFile("image1", "test1.jpg", "image/jpeg", "dummy".getBytes());
MockMultipartFile file2 = new MockMultipartFile("image2", "test2.jpg", "image/jpeg", "dummy".getBytes());
multipartFileList.add(file1);
multipartFileList.add(file2);
// Spy를 사용하여 실제 메서드 호출을 추적
MockMultipartFile spyFile1 = Mockito.spy(file1);
MockMultipartFile spyFile2 = Mockito.spy(file2);
// when
imageService.createImage(market, List.of(spyFile1, spyFile2));
// then
// imageRepository가 save 메서드를 2번 호출되었는지 검증
verify(imageRepository, times(2)).save(any());
// transferTo가 실제로 호출되었는지 확인 (파일이 실제로 저장되진 않지만, 이 메서드가 호출됐는지 검증)
verify(spyFile1, times(1)).transferTo(any(File.class));
verify(spyFile2, times(1)).transferTo(any(File.class));
// 첫 번째 파일명을 정확하게 검증
ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
verify(market, times(1)).updateThumbnailPath(captor.capture());
String capturedThumbnailPath = captor.getValue();
assertTrue(capturedThumbnailPath.contains("test1.jpg"), "첫 번째 이미지가 썸네일로 설정되어야 합니다.");
}
}
매장의 이미지를 저장할 때 첫번 째 이미지가 썸네일로 지정이 되는지, 파일의 전송메서드가 실행이 되는 지 테스트 해보았다.
Repository 테스트 코드
메인 로직을 테스트 해보고 싶었지만, 연관관계가 설정돼 있는 Category나 Local같은 객체들은 DB에서 직접 설정 해준 엔티티들이기 떄문에, 생성자가 존재하지 않아 테스트를 위한 생성자나 builder를 생성하는게 맞는지 생각이 들어 나중에 올려야겠다.
'쿠러미' 카테고리의 다른 글
| [쿠러미] FCM 구독, 알림 기능 개발 & 비동기 전환 (0) | 2025.03.31 |
|---|---|
| [쿠러미] Springboot +프로메테우스 + 그라파나 연동 (0) | 2025.03.19 |
| Mysql 프로시저로 더미데이터 생성 (0) | 2025.03.18 |
| [쿠러미] 성능 테스트 시작 - Ngrinder (2) | 2025.03.17 |
| LocalDateTime, DATETIME 불일치 해결 (0) | 2024.12.27 |