1. 소개

이 빠른 튜토리얼에서는 JUnit 라이브러리를 사용하여 예외가 발생했는지 테스트하는 방법을 살펴볼 것입니다.

물론 JUnit 4와 JUnit 5 버전을 모두 다룰 것입니다.

2. JUnit 5

JUnit 5 Jupiter assertions API는 예외를 주장하기위한 assertThrows 메소드를 도입했습니다 .

이것은 예상되는 예외의 유형과 람다 표현식을 통해 테스트중인 코드를 전달할 수 있는 실행 가능 기능 인터페이스를 취합니다 .

@Test
public void whenExceptionThrown_thenAssertionSucceeds() {
    Exception exception = assertThrows(NumberFormatException.class, () -> {
        Integer.parseInt("1a");
    });

    String expectedMessage = "For input string";
    String actualMessage = exception.getMessage();

    assertTrue(actualMessage.contains(expectedMessage));
}

예상되는 예외가 throw 되면 assertThrows  는 예외를 반환하므로 메시지에 대해서도 assert 할 수 있습니다.

또한 포함 된 코드가 NullPointerException 유형 또는 파생 유형 의 예외를 throw 할 때이 어설 션이 충족 된다는 점에 유의해야 합니다 .

우리가 통과하면 있음이 수단 예외를 예상 예외 유형으로, 던져진 예외는 주장이 있기 때문에 성공 할 것입니다 예외는 모든 예외의 슈퍼 타입이다.

RuntimeException 을 예상하도록 위의 테스트를 변경하면 다음도 통과합니다.

@Test
public void whenDerivedExceptionThrown_thenAssertionSucceds() {
    Exception exception = assertThrows(RuntimeException.class, () -> {
        Integer.parseInt("1a");
    });

    String expectedMessage = "For input string";
    String actualMessage = exception.getMessage();

    assertTrue(actualMessage.contains(expectedMessage));
}

assertThrows ()는 우리가 사용할 수 있기 때문에 방법은 예외 주장 논리를 더 세밀하게 제어 할 수 있도록 코드의 특정 부분을 주변.

3. JUnit 4

JUnit 4를 사용할 때 @Test 어노테이션 예상 속성을 사용 하여 어노테이션이있는 테스트 메소드에서 예외가 발생할 것으로 예상 함을 선언 할 수 있습니다.

결과적으로 테스트가 실행될 때 지정된 예외가 throw되지 않으면 실패하고 throw되면 통과합니다.

@Test(expected = NullPointerException.class)
public void whenExceptionThrown_thenExpectationSatisfied() {
    String test = null;
    test.length();
}

이 예제에서는 테스트 코드가 NullPointerException 을 발생시킬 것으로 예상한다고 선언했습니다 .

예외가 발생했다는 주장에만 관심이 있다면 이것으로 충분합니다.

예외의 다른 속성을 확인해야 할 때 ExpectedException 규칙을 사용할 수 있습니다 .

예외 메시지 속성을 확인하는 예를 살펴 보겠습니다 .

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

@Test
public void whenExceptionThrown_thenRuleIsApplied() {
    exceptionRule.expect(NumberFormatException.class);
    exceptionRule.expectMessage("For input string");
    Integer.parseInt("1a");
}

위의 예에서 먼저 ExpectedException 규칙을 선언합니다 . 그런 다음 테스트에서 Integer을 구문 분석하려는 코드가 "For input string"메시지와 함께 NumberFormatException발생 시킨다고 주장합니다 .

4. 결론

이 기사에서는 JUnit 4와 JUnit 5에서 예외를 주장하는 방법을 다뤘습니다.

예제의 전체 소스 코드는 GitHub에서 사용할 수 있습니다 .