본문 바로가기
Develop/Java

[Java] org.opentest4j.AssertionFailedError: Expected ... to be thrown, but nothing was thrown. 에러

by 연로그 2021. 12. 7.
반응형

에러: org.opentest4j.AssertionFailedError:  Expected java.lang.IllegalArgumentException to be thrown, but nothing was thrown.

 

📜 에러 설명

Exception 발생이 있을거라 생각을 했는데~

but nothing was thrown... 발생하지 않았다고 한다.

 

말그대로 Exception이 발생하지 않았기 때문에 발생한 문제라...

다양한 원인과 다양한 해결방법이 존재할 것이다.

 

🧨 원인

일단 나 같은 경우는 Exception 던진걸 try-catch로 감쌌기 때문에 실패했다.🤯

결론부터 말하자면 이 경우에도 해결 방법이 여러가지 있다.

  1. 예외 전파하기
  2. 테스트하는 메소드 변경
  3. 테스트 코드 변경

 

🔍 테스트 예제

원본 코드는 구조 설명하기 복잡해서 간단한 예제를 만들어보았다.

아래와 같이 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()
    );
}

 

🔻 예외를 보존하는 이유

더보기
pic: CodeJava

 

위와 같은 스택으로 Exception을 계속 throw 하면 개발자들은 Exception을 추적하며 디버깅할 수 있게 된다.

또한 각 계층마다 고유한 Exception을 정의하면서 throw하기 때문에 프로그램의 논리 계층 간의 추상화를 촉진시킨다.

 

2. 테스트하는 메소드 변경

throw되는 메소드를 직접 테스트하기

@Test
void 테스트() {
    assertThrows(IllegalArgumentException.class,
            () -> throwMethod()
    );
}

성공한 테스트 결과!

 

3. 테스트 코드 변경

나같은 경우에는 try-catch로 특정 로직이 분기처리 되어있었다.

(좋지 않은 방법임은 알지만 throw 이후에 실행되어야 하는 로직이 따로 존재해서 이렇게 했다.)

그 로직을 고려하며 테스트 코드를 변경하여 진행하였다.

 


참고

  1. Exception Chaining

 

반응형

'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