Skip to content

[pg.606] 단축 URL 부재 시 발생하는 NotFoundShortenUrlException을 처리하는 테스트 코드 자율과제 #14

@zakard114

Description

@zakard114

단축 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);
    //    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions