SALT 추가 로직 테스트하기

Regular Kim·2025년 5월 13일
0

Reelvy

목록 보기
3/11

이 글은 여기서 참고하여 작성하였다.

변경 배경

기존에는 FileSaveResolver 내부에서 고유 파일 경로를 만들기 위해 UUID.randomUUID()를 직접 호출했다:

public class FileSaveResolver {
    public String resolvePath(String basePath, String originalFilename) {
        String salt = UUID.randomUUID().toString();
        return basePath + "/" + salt + "_" + originalFilename;
    }
}

이 방식은 단순하지만 테스트에서 문제가 발생한다. UUID는 매 실행마다 값이 달라지기 때문에, 경로 결과를 예측할 수 없어 단위 테스트에서 검증이 불가능하다.

해결책: SaltUtil 클래스 분리

UUID 생성을 외부에서 주입하도록 하여, 테스트 환경에서는 고정된 값을 반환하게 만들었다.

  1. SaltGenerator 구현체
@Component
public class SaltUtil {

	public String salt() {
		return UUID.randomUUID().toString();
	}
}
  1. FileSaveResolver 리팩토링
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으로 원하는 값을 지정하여 테스트할 수 있게 개선되었다.

profile
What doesn't kill you, makes you stronger

0개의 댓글