영호
[JUnit] JUnit5 예외 테스트코드 작성(assertThrows) 본문
들어가며
테스트 코드 작성 시 정상적인 기능 수행 결과를 테스트하는 것만큼 예외 상황을 테스트하는 것도 중요하기 때문에, 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이 있습니다."이라 테스트가 실패하는 것을 볼 수 있습니다.
마무리
- 위와 같이 에러 메시지를 비교해 보다 정확한 예외 테스트를 간단하게 진행해봤습니다.
'Test > JUnit' 카테고리의 다른 글
[Junit] 병렬 실행을 통해 빌드 시간 단축해보기 (0) | 2023.11.12 |
---|---|
[JUnit5] isSameAs, isEqualTo 차이 (0) | 2022.06.13 |
[JUnit] JUnit, Assertj 프로젝트 생성 with 인텔리제이 (0) | 2022.05.15 |
[JUnit] JUnit, Assertj 설정, 테스트코드 작성 (0) | 2022.05.15 |
Comments