반응형

 

Exception 발생을 검증하기

- Junit <= 4.12 인 경우

@Test(expected = IndexOutOfBoundsException.class)
public void testIndexOutOfBoundsException() {

    ArrayList emptyList = new ArrayList();
    Object o = emptyList.get(0);
}

 

- JUnit 5 and JUnit 4.13 인 경우

@Test
void exceptionTesting() {
    ArithmeticException exception = assertThrows(ArithmeticException.class, () ->
        calculator.divide(1, 0));

    assertEquals("/ by zero", exception.getMessage());
}

 

 

Exception 발생하지 않는 걸 검증하기

(1) 테스트 코드에 exception이 발생하지 않고, exeption 발생을 검증하는 방법

아래의 방법으로 하면, exception을 catch하여 명시적으로 fail을 assert하기 때문에, 테스트 실행 자체에 exception이 발생하지 않게 된다.

@Test
public void someTest() {
   try {
     someMethod();
   }
   catch (Exception e) {
     Assert.fail("Exception " + e);
   }
}

 

 

(2) 테스트 함수 자체에 Exception을 던지는 방법

@Test
public void someTest() throws Exception {
     someMethod();
}

 

테스트 메서드에서 Exception을 던질 가능성이 있는 경우, 이를 위와 같이 명시적으로 선언할 수 있다.
throws Exception을 사용하면 테스트 코드 내부에서 try-catch 없이 예외를 던질 수 있어 코드가 간결해진다.
JUnit은 테스트 메서드가 throws Exception을 포함하는 것을 허용하므로, 예외 발생 시 JUnit이 이를 감지하고 테스트가 실패하게 된다.

 

만약에 "throws Exception"이 없다면?

테스트 메서드에서 throws Exception을 제거하면, 내부에서 발생하는 예외를 반드시 try-catch로 처리해야 한다.
예외 처리를 하지 않고 checked exception(예: IOException, SQLException)이 발생하면 컴파일 오류가 발생한다.
그러나, unchecked exception(예: NullPointerException, IllegalArgumentException)이 발생하면 JUnit이 자동으로 감지하여 테스트 실패로 처리된다.

 

*(1), (2) 경우 모두 예외가 발생해도 다른 테스트 메서드는 영향이 가진 않는다.

 

참고자료

https://stackoverflow.com/questions/156503/how-do-you-assert-that-a-certain-exception-is-thrown-in-junit-tests

https://stackoverflow.com/questions/31423643/try-catch-in-a-junit-test

반응형