JUnit ExpectedException 규칙을 통해 예외를 테스트하는 것은 다른 assertion과 섞여서는 안됩니다.

 

org.junit.rules.ExpectedException를 예외를 테스트할 때, 예외가 발생한 다음 코드는 실행되지 않을 것입니다. 따라서 assertion을 예외가 발생한 뒤에 붙이는 것은 잘못된 것이고 오해의 소지가 있습니다. 이 규칙은 expect() 함수 호출 뒤에 assertion이 불려지는 경우 문제를 제기하며 예상된 예외를 던지는 코드만 expect() 다음에 와야 합니다.

org.junit.Assert.assertThrows를 사용하는 것을 고려할 수 있습니다. 해당 함수는 JUnit 4.13 부터 사용 가능하며 추가적인 후속 assertion을 허용합니다.

또는, JUnit 4.13 버전 미만이거나 프로젝트에서 람다를 지원하지 않는 경우 try-catch idiom을 사용할 수 있습니다.

규칙을 어긴 코드

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

@Test
public void test() throws IndexOutOfBoundsException {
    thrown.expect(IndexOutOfBoundsException.class); // 규칙을 어긴 코드
    Object o = get();
    // 이 테스트는 실행이 이 라인을 통과하지 못하므로 통과합니다.
    Assert.assertEquals(0, 1);
}

private Object get() {
    throw new IndexOutOfBoundsException();
}

규칙을 준수한 코드

Assert.assertThrows(IndexOutOfBoundsException.class, () -> get());
// 테스트는 정상적으로 실패합니다.
Assert.assertEquals(0, 1);
try {
    get();
    Assert.fail("Expected an IndexOutOfBoundsException to be thrown");
} catch (IndexOutOfBoundsException e) {}
Assert.assertEquals(0, 1); // 정상적으로 실패합니다.

참고

If you like SONARKUBE, don’t forget to give me a star. :star2:

원문으로 바로가기

Star This Project