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();
}
규칙을 준수한 코드
- For JUnit >= 4.13, use org.junit.Assert.assertThrows
Assert.assertThrows(IndexOutOfBoundsException.class, () -> get());
// 테스트는 정상적으로 실패합니다.
Assert.assertEquals(0, 1);
- For JUnit < 4.13, use the try-catch idiom:
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.