먼저 해당 글을 작성하게 된 계기는 예외처리 테스트를 하던 와중에 assertThatThrownBy()로 예외가 발생하지 않는 경우를 처리를 하려고 했는데, 처리가 되지 않아 해당 내용에 대해 자세하게 알아보게 되었다. 그 과정에서 동료와 얘기를 나누면서 좋은 자료를 공유해주어서 정리하게 되었다.
설정
spring-boot-starter-web 을 선택했다면 spring-boot-start-test 의존성이 추가되어있다.
최근 버전은 Junit5가 기본적으로 되어 있어서 바로 Junit5를 사용할 수 있으나, 자바 프로젝트에서는 바로 주입이 안되어 있으므로 따로 설정이 필요하다.
Maven Repository: org.junit.jupiter » junit-jupiter-api
해당 레포지토리에서 Junit5 dependency 적용이 가능하다. 하지만 Spring Boot를 사용하게 되면 일반적인 jupiter junit5 를 사용하기 보다 AssertJ 를 사용하는 사람이 많다.
Maven Repository: org.assertj » assertj-core
해당 레포지토리에서 AssertJ 적용이 가능하다.
예외 체크 방법
방법 1. assertThrows
@Test
public void junit5에서_exception_테스트_1() {
Assertions.assertThrows(RuntimeException.class, () -> {
DoSomething.func();
});
}
방법 2. assertj의 assertThatThrownBy
@Test
public void junit5에서_exception_테스트_2() {
assertThatThrownBy(() -> DoSomething.func())
.isInstanceOf(RuntimeException.class);
}
@Test
public void junit5에서_exception_테스트_2() {
assertThatThrownBy(() -> DoSomething.func())
.hasMessageContaining();
}
방법 3. 예외 메시지 테스트 - assertEquals (try ~ catch)
@Test
public void junit5에서_exception_테스트_3() {
try {
DoSomething.func();
} catch (RuntimeException e) {
Assertions.assertEquals("some exception message...", e.getMessage());
}
}
이 방법은 권장을 하지 않는다. 예외 메시지는 주로 static final String 으로 고정을 해두긴하지만, 그래도 변할 가능성이 있기 때문이다. 다음과 같은 방법을 권장한다.
방법 4. 예외 메시지 테스트 - assertThrows 반환값 사용
@Test
public void junit5에서_exception_테스트_4() {
Throwable exception = assertThrows(RuntimeException.class, () -> {
DoSomething.func();
});
assertEquals("some exception message...", exception.getMessage());
}
테스트 클래스 오류
org.junit.platform.launcher.core.EngineDiscoveryOrchestrator lambda$logTestDescriptorExclusionReasons$7
정보: 0 containers and 1 tests were Method or class mismatch
단순히 Test 메서드를 여러 개 작성하고 하나만 실행하면 나오는 에러이다.
Expecting code to raise a throwable. java.lang.AssertionError 에러 해결
assertThatThrownBy()로 진행하는 테스트는 기본적으로 예외가 발생하는 코드에 대해서 적용되는 코드이다.
하지만 assertThatThrownBy() 를 사용하고 .doesNotThrowAnyException(); 을 붙이니 예외가 발생하지 않았으니 먼저 테스트에서 잘라버린 것이다.
해결 방법
- assertThatThrownBy() 대신, assertThatCode() 를 사용하자.
- assertThatThrownBy()는 예외가 던져지지 않으면 바로 실패하지만, assertThatCode()는 예외가 던져지지 않아도 실패하지 않는다.
참고 자료
'프로그래머스 데브코스' 카테고리의 다른 글
백엔드 데브코스 6주차 회고 (0) | 2023.07.17 |
---|---|
프로그래머스 백엔드 데브코스 1달차 회고 (0) | 2023.07.07 |
프로그래머스 데브코스 17일차 - 자바 타입추론 var (0) | 2023.06.19 |
프로그래머스 데브코스 2주차 회고 (0) | 2023.06.19 |
프로그래머스 데브코스 12일차 - 테코톡 발표 & EC2 spot Instance 구매 옵션 (0) | 2023.06.16 |