[JUnit5] 예외 처리 테스트하는 방법, assertThrows 메소드

안녕하세요. 오늘은 예외처리한 부분을 테스트하기 위한 JUnit 단위테스트 방법을 포스팅하고자 합니다.

 

보통 대부분의 회사나 프로젝트에서 특정한 목적으로 제작한 커스텀 Exception 객체들이 있을 것입니다. 그러한 경우, 다른 Exception 처리보다 많은 테스트가 필요하게 될텐데요. 그 방법중 하나를 공유해보고자 합니다.

 

먼저 CustomException 객체를 만듭니다. 매우 간단히 만들었습니다.

public class CustomException extends Exception{
    public CustomException(String message) {
        super(message);
    }
}

- Exception 객체를 생성하기 위한 생성자만 구현해놓은 정도입니다. 추후 필요한 생성자들을 오버로딩하여 구현하시면 될 부분입니다.

 

예외를 유도하는 클래스를 하나 생성하였습니다. 생성자로 넘어오는 argument값이 음수인 경우 CustomException 예외를 발생시키도록 유도하였습니다.

public class CustomClass {

    private int customInt;

    public CustomClass(int customInt) throws CustomException {
        if(customInt < 0){
            throw new CustomException("CustomException!!!");
        }
        this.customInt = customInt;
    }

}

 

다음 상황을 테스트할 테스트코드입니다.

@Test
void test2() {
	CustomException exception = assertThrows(CustomException.class, ()-> new CustomClass(-1));
    String message = exception.getMessage();
    assertEquals("CustomException!!!", message);
}

- assertThrows(Class<> classType, Executable executable)

- assertThrows 메소드는 첫번째 인자로 발생할 예외 클래스의 Class 타입을 받습니다. executable을 실행하여 예외가 발생할 경우 classType과 발생된 Exception이 같은타입인지 체크합니다. 사실 같은 타입보다는 상속관계도 포함됩니다. 다음의 사진을 보면 바로 이해되실거에요.

JUnit assertThrows 메소드 뜯어보기

위의 사진처럼 결과적으로 발생한 Throwable 객체인 var5에는 CustomException 인스턴스가 담겨있고 그것을 리턴해줍니다.

 

테스트의 첫번째 줄이 끝났고 반환된 exception의 메시지를 확인하여 제가 의도한 메시지와 같은지 테스트하였습니다.

 

결과

무소식이 희소식이라고 아무 에러메시지가 보이지 않고 잘 통과된 모습입니다.!!

댓글

Designed by JB FACTORY