-
Notifications
You must be signed in to change notification settings - Fork 14
Description
단축 URL 부재 시 발생하는 NotFoundShortenUrlException을 처리하는 테스트 코드를 아래와 같이 작성하였으며, 모든 검증을 완료하였습니다. 개선사항이나 좋은 의견 또는 조언을 환영합니다.
@test
@DisplayName("shortenUrlKey")
void generateShortenUrl(){
String expectedOriginalUrl = "https://www.google.com";
ShortenUrlCreateRequestDto shortenUrlCreateRequestDto = new ShortenUrlCreateRequestDto(expectedOriginalUrl);
ShortenUrlCreateResponseDto shortenUrlCreateResponseDto = simpleShortenUrlService.generateShortenUrl(shortenUrlCreateRequestDto);
String shortenUrlKey = shortenUrlCreateResponseDto.getShortenUrlKey();
String originalUrl = null;
try {
originalUrl = simpleShortenUrlService.getOriginalUrlByShortenUrlKey(shortenUrlKey);
} catch (Exception e){
System.out.println("Error occurred: "+e.getMessage());
}
assertTrue(originalUrl.equals(expectedOriginalUrl));
try블록을 이용하여 originalUrl을 찾는 코드이다. 그 과정에서 shortenUrlKey와 매치되는 shortenUrl을 추출하는 작업이 수행된다. 만약 shortenUrl을 shortenUrlRepository로부터 찾지 못한 경우에는 catch 블록에서 RuntimeException을 상속받는 NotFoundShortenUrlException 인스턴스가 생성되어 예외를 처리한다.
이 외에 Optional을 사용하여 유효성과 예외를 처리할 수 있는 방법이 있다. Optional을 사용함으로써 Collection에 값이 부재할때 null을 반환하는 대신, 비어있는 상태를 명시적으로 표현하게 한다. 이로써 NullPointerException을 방지하고 안전한 코드를 작성할 수 있다.
단, 이 경우 Service의 코드 일부를 변경할 필요가 있으며, 그 결과물이 아래의 getOriginalUrlByShortenUrlKey2이다.
// SimpleShortenUrlService.java:
public Optional < String > getOriginalUrlByShortenUrlKey2 (String shortenUrlKey){
ShortenUrl shortenUrl = shortenUrlRepository.findShortenUrlByShortenUrlKey(shortenUrlKey);
if(null == shortenUrl) return Optional.empty();
shortenUrl.increaseRedirectCount();
shortenUrlRepository.saveShortenUrl(shortenUrl);
String originalUrl = shortenUrl.getOriginalUrl();
return Optional.of(originalUrl);
}
그리고 Optional을 반환값으로 받는 클라이언트 코드(테스트코드)는 아래와 같다.
Optional < String > originalUrlInOptional;
// getOriginalUrlByShortenUrlKey2
originalUrlInOptional = simpleShortenUrlService.getOriginalUrlByShortenUrlKey2(shortenUrlKey);
if(originalUrlInOptional.isPresent()){
originalUrl = originalUrlInOptional.get();
} else {
System.out.println("Url not found");
}
assertTrue(originalUrl.equals(expectedOriginalUrl));
위의 코드에서는 .getOriginalUrlByShortenUrlKey2 메서드가 originalUrl을 Optional로 감싸서 반환한다. 그 과정에서 만약 shortenUrl이 shortenUrlRepository에 존재하지 않는다면 null 대신에 Optional.empty()를 반환한다.
테스트 코드에서는 반환된 Optional객체를 originalUrl2로 받아 존재 유무를 판정한다. 비어있는 값을 String으로 반환하고자 한다면 NotFoundShortenUrlException 의 생성자를 다음과 같이 생성하여 클라이언트 코드에게 우리가 직접 작성하여 보낸 문자열 오류메시지를 받게할 수도 있다.
// public class NotFoundShortenUrlException extends RuntimeException{
// public NotFoundShortenUrlException(String message){
// super(message);
// }
}