-
[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 되지 않고 넘어갔을 때, 테스트가 실패하도록 코드를 작성해야 되는데 실패를 강제하는 코드가 누락될 수 있다.
참고
'자바' 카테고리의 다른 글
[Java] Array를 List로, List를 Array로 변경하는 방법 (0) 2022.12.30 이클립스 설치하기( eclipse 설치 , hello world! 출력 ) (0) 2019.07.22 java 설치하기 ( JDK 설치, 환경변수 설정, 테스트) (6) 2019.07.21