ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] JUnit를 이용해 예외 테스트하기
    자바 2022. 12. 22. 13:30

    JUnit으로 예외 테스트 하는 방법을 정리해보았다. 

    @Test(expected=Throwable.class)

    Junit은 기본적으로 @Test 어노테이션의 expected 속성을 통한 예외처리를 제공한다.

    테스트 코드에서 expected 속성에 지정한 예외가 발생한다면 테스트가 성공한다.

    @Test(expected = RuntimeException.class)
    public void test() throws Exception {
    	throw new RuntimeException;
    }

    try-catch 구문

    또 다른 방법은 try-catch를 이용하는 방법이다.

    Assert 클래스의 fail() 메서드를 추가하여, 예외를 잡지 못한 경우에 강제로 에러를 발생시켜 테스트 실패를 하도록 구성했다.

    import static org.junit.Assert.*;
    
    public TestClass {
    
        @Test
        public void test() {
            try {
    
            } catch (RuntimeException e) {
                return;
            }		
            fail("no exception!");
        }
    
    }

    AssertJ 라이브러리

    AssertJ 라이브러리는 다양한 예외 처리 방식을 제공한다.

    import static org.assertj.core.api.Assertions.*;
    
    public TestClass {
    
        @Test
        public void test1() {
            assertThatThrownBy(() -> { throw new Exception("boom!"); })
                .isInstanceOf(Exception.class)
                .hasMessageContaining("boom");
        }
    
        @Test
        public void test2() {
            // given
            String[] names = { "kim", "lee", "park" };
    
            // when
            Throwable thrown = catchThrowable(() -> System.out.println(names[9]));
    
            // then
            then(thrown).isInstanceOf(ArrayIndexOutOfBoundsException.class)
                              .hasMessageContaining("9");
        }
    
    }

    테스트 코드를 짤 때 팀별 코드컨벤션에 따라 다르겠지만 개인적으로 AssertJ가 좋다고 생각하는데 이유는 다음과 같다.

    • @Test 어노테이션에 excepted 속성은 테스트가 어떤 예외를 반환하는지 알기는 쉽지만, 테스트 코드 내부에 어떤 코드에서 예외가 발생하는지 알기가 어렵다.
    • try-catch 구문은 예외가 catch 되지 않고 넘어갔을 때, 테스트가 실패하도록 코드를 작성해야 되는데 실패를 강제하는 코드가 누락될 수 있다. 

     

    참고

Designed by Tistory.