에러: org.opentest4j.AssertionFailedError: Expected java.lang.IllegalArgumentException to be thrown, but nothing was thrown.
📜 에러 설명
Exception 발생이 있을거라 생각을 했는데~
but nothing was thrown... 발생하지 않았다고 한다.
말그대로 Exception이 발생하지 않았기 때문에 발생한 문제라...
다양한 원인과 다양한 해결방법이 존재할 것이다.
🧨 원인
일단 나 같은 경우는 Exception 던진걸 try-catch로 감쌌기 때문에 실패했다.🤯
결론부터 말하자면 이 경우에도 해결 방법이 여러가지 있다.
- 예외 전파하기
- 테스트하는 메소드 변경
- 테스트 코드 변경
🔍 테스트 예제
원본 코드는 구조 설명하기 복잡해서 간단한 예제를 만들어보았다.
아래와 같이 throw를 하는 메소드와 이를 try-catch하는 메소드가 존재한다.
private void throwMethod() {
throw new IllegalArgumentException();
}
private void tryCatchMethod() {
try {
throwMethod();
} catch (IllegalArgumentException e) {
System.out.println(e.toString());
}
}
@Test
void 테스트() {
assertThrows(IllegalArgumentException.class,
() -> tryCatchMethod()
);
}
테스트 결과는? 이 포스팅의 제목과 같이 실패했다.
그렇다면 throw가 안된건가? 의심해봤으나 catch 쪽으로 잘 빠져서 System.out.println()을 잘 실행시켰다.
1. 예외 전파하기
예외를 전파하는 이유는 보통 예외를 보존하기 위해서이다.
(아래 코드 중 tryCatchException은 임의로 만든 Exception용 클래스임)
private void throwMethod() {
throw new IllegalArgumentException();
}
private void tryCatchMethod() throws tryCatchException {
try {
throwMethod();
} catch (IllegalArgumentException e) {
System.out.println(e.toString());
throw new tryCatchException();
}
}
@Test
void 테스트() {
assertThrows(tryCatchException.class,
() -> tryCatchMethod()
);
}
🔻 예외를 보존하는 이유
위와 같은 스택으로 Exception을 계속 throw 하면 개발자들은 Exception을 추적하며 디버깅할 수 있게 된다.
또한 각 계층마다 고유한 Exception을 정의하면서 throw하기 때문에 프로그램의 논리 계층 간의 추상화를 촉진시킨다.
2. 테스트하는 메소드 변경
throw되는 메소드를 직접 테스트하기
@Test
void 테스트() {
assertThrows(IllegalArgumentException.class,
() -> throwMethod()
);
}
3. 테스트 코드 변경
나같은 경우에는 try-catch로 특정 로직이 분기처리 되어있었다.
(좋지 않은 방법임은 알지만 throw 이후에 실행되어야 하는 로직이 따로 존재해서 이렇게 했다.)
그 로직을 고려하며 테스트 코드를 변경하여 진행하였다.
참고
'Develop > Java' 카테고리의 다른 글
[JPA] JPA란? (0) | 2022.01.03 |
---|---|
[Java] Enum에 대해 (4) | 2021.12.13 |
[Mockito] Mockito란? (0) | 2021.12.02 |
[Java] java.lang.UnsupportedOperationException (1) | 2021.11.21 |
Comparator와 Comparable 정리 (0) | 2021.10.21 |