JUnit의 Exception 테스트

By JS | Last updated: May 22, 2021

테스트를 실행했을 때, 예외가 발생하는지 확인하는 방법들을 소개합니다.

Annotation을 이용한 방법

Annotation을 이용하여 Exception이 발생되었는지 테스트할 수 있습니다. @Test(expected = Exception)처럼 코드를 실행했을 때 예상되는 Exception을 명시하시면 됩니다. 아래 코드에서는 NullPointerException가 발생하면 테스트는 패스하고, 발생하지 않으면 실패하게 됩니다.

@Test(expected = NullPointerException.class)
public void testExceptionThrown() {
    String str = null;

    str.contains("a");
}

ExpectedException Rule을 이용한 방법

ExpectedException라는 Rule을 이용하여 Exception이 발생되는지 테스트할 수 있습니다.

아래 테스트에서 NullPointerException이 발생하면 테스트는 패스합니다. expect() 메소드에 발생할 것이라고 예상하는 Exception을 명시하면 됩니다.

@Rule
public ExpectedException exceptionRule = ExpectedException.none();

@Test
public void testExceptionThrown() {
    exceptionRule.expect(NullPointerException.class);

    String str = null;
    str.contains("a");
}

Exception의 메시지 내용 확인

위의 코드에서 NullPointerException이 발생하면 테스트는 패스하겠지만, 내가 예상한 코드에서 Exception이 발생했는지 보장하기 어려울 때도 있습니다. 이런 경우, Exception의 메시지 내용까지 확인하면 좀 더 정확하게 테스트할 수 있습니다.

아래 코드에서는 NullPointerException의 메시지가 "Null object is invoked"일 때만 테스트가 패스합니다.

@Rule
public ExpectedException exceptionRule = ExpectedException.none();

@Test
public void testExceptionThrown2() {
    exceptionRule.expect(NullPointerException.class);
    exceptionRule.expectMessage("Null object is invoked");

    throw new NullPointerException("Null object is invoked");
}

만약 아래와 같이 다른 메시지의 NullPointerException이 발생하면 테스트는 실패합니다.

@Test
public void testExceptionThrown2() {
    exceptionRule.expect(NullPointerException.class);
    exceptionRule.expectMessage("Null object is invoked");

    throw new NullPointerException("Null object");
}

실패 메시지는 다음처럼 보이게 됩니다.

java.lang.AssertionError:
Expected: (an instance of java.lang.NullPointerException and exception with message a string containing "Null object is invoked")
     but: exception with message a string containing "Null object is invoked" message was "Null object"

try-catch를 이용한 방법

아래처럼 try-catch를 이용하여 예외가 발생하는지 테스트할 수 있습니다. 예외가 발생하면 catch로 이동하기 때문에, fail()이 호출되지 않고 테스트는 패스하게 됩니다. 만약 Exception이 발생하지 않았다면, fail()이 호출되어 테스트는 실패하게 됩니다.

@Test
public void testExceptionThrown3() {
    try {
        String str = null;
        str.contains("a");

        fail();
    } catch (NullPointerException e) {
        // pass
    }
}
댓글을 보거나 쓰려면 이 버튼을 눌러주세요.
codechachaCopyright ©2019 codechacha