영호

[JUnit] JUnit5 예외 테스트코드 작성(assertThrows) 본문

Test/JUnit

[JUnit] JUnit5 예외 테스트코드 작성(assertThrows)

0h0 2022. 5. 16. 12:08

들어가며

테스트 코드 작성 시 정상적인 기능 수행 결과를 테스트하는 것만큼 예외 상황을 테스트하는 것도 중요하기 때문에, JUnit5를 이용해 예외 상황에 대한 테스트 코드 작성을 알아볼 예정입니다.

 

테스트할 method 코드

public class Calculator {
    int sum(int a, int b){
        if (a == 0 || b == 0){
            throw new IllegalStateException("입력에 0이 있습니다.");
        }
        return a + b;
    }
}
  • 위 코드는 a, b 입력이 들어오면 두 수를 더해서 반환해주는 sum함수입니다.
  • 만약 a, b 중 0이 들어오게 되면 IllegalStateException("입력에 0이 있습니다.") 오류를 발생시킵니다.

예외 테스트 코드 작성

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.*;

class CalculatorTest {

    @Test
    void testSum() {
        Calculator cal = new Calculator();

        int result = cal.sum(1, 3);

        assertThat(result).isEqualTo(4);
    }

    @Test
    void sumExceptionTest(){
        Calculator cal = new Calculator();

        IllegalStateException e = Assertions.assertThrows(IllegalStateException.class
        , () -> cal.sum(3, 0));

        assertThat(e.getMessage()).isEqualTo("입력에 0이 있습니다.");

    }
}
  • 위 테스트 코드는 sum함수에 대한 정상적인 상황 테스트와 예외 상황 테스트 코드를 작성한 것입니다.
  • sumExceptionTest()에서 예외상황에 대해 테스트를 진행하기 위해 입력에 0을 집어넣었습니다.
  • JUnit의 assertThrows를 이용했습니다.
  • assertThrows로 e에 발생한 에러를 할당받습니다.
assertThrows(에러 class, 에러가 발생해야 하는 로직)
  • 이후 assertJ의 assertThat을 이용해 에러 메시지를 비교해서 내가 기대하는 에러 메시지와 코드 실행 중 발생한 에러가 같으면 테스트가 성공합니다.

테스트 실행

테스트 성공

테스트-성공-스크린샷
테스트 성공

  • 2가지 테스트 모두 성공했습니다.
  • 이제 에러 메시지를 수정해 테스트 실패를 유도해보겠습니다.

테스트 실패

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.*;

class CalculatorTest {

    @Test
    void testSum() {
        Calculator cal = new Calculator();

        int result = cal.sum(1, 3);

        assertThat(result).isEqualTo(4);
    }

    @Test
    void sumExceptionTest(){
        Calculator cal = new Calculator();

        IllegalStateException e = Assertions.assertThrows(IllegalStateException.class
        , () -> cal.sum(3, 0));

        assertThat(e.getMessage()).isEqualTo("입력에 0이 있습니다.11");

    }
}
  • 위와 같이 기대하는 에러 메시지를 "입력에 0이 있습니다. 11"로 수정 후 테스트를 진행하게 되면 테스트가 실패합니다.

테스트-실패-스크린샷
테스트 실패

  • 기대하는 메시지는 "입력에 0이 있습니다. 11"이지만 실제로 발생한 에러 메시지는 "입력에 0이 있습니다."이라 테스트가 실패하는 것을 볼 수 있습니다.

마무리

  • 위와 같이 에러 메시지를 비교해 보다 정확한 예외 테스트를 간단하게 진행해봤습니다.
Comments