이 글은 여기서 참고하여 작성하였다.
기존에는 FileSaveResolver 내부에서 고유 파일 경로를 만들기 위해 UUID.randomUUID()를 직접 호출했다:
public class FileSaveResolver {
public String resolvePath(String basePath, String originalFilename) {
String salt = UUID.randomUUID().toString();
return basePath + "/" + salt + "_" + originalFilename;
}
}
이 방식은 단순하지만 테스트에서 문제가 발생한다. UUID는 매 실행마다 값이 달라지기 때문에, 경로 결과를 예측할 수 없어 단위 테스트에서 검증이 불가능하다.
UUID 생성을 외부에서 주입하도록 하여, 테스트 환경에서는 고정된 값을 반환하게 만들었다.
@Component
public class SaltUtil {
public String salt() {
return UUID.randomUUID().toString();
}
}
public class FileSaveResolver {
private final SaltUtil saltUtil;
public FileSaveResolver(SaltUtil saltUtil) {
this.SaltUtil = saltUtil;
}
public String resolvePath(String basePath, String originalFilename) {
String salt = saltUtil.salt();
return basePath + "/" + salt + "_" + originalFilename;
}
}
@Test
@DisplayName("유저 이미지를 저장한다.")
void testResolveUserImagePath_returnsExpectedPath() {
User mockUser = mock(User.class);
when(mockUser.getUsername()).thenReturn("john");
UserImageCategory category = mock(UserImageCategory.class);
when(category.getFileName()).thenReturn("profile");
when(mockSaltUtil.salt()).thenReturn("123abc");
// slatUtil 모킹
String result = filePathUtil.resolveUserImagePath(mockUser, "image.png", category);
// salt값을 예상할 수 있다. -> 테스트 코드 작성 용이
assertEquals("/upload/john/photos/profile123abc_image.png", result);
}
salt를 분리했기 때문에 mock으로 원하는 값을 지정하여 테스트할 수 있게 개선되었다.