1) org.mockito.exceptions.base.MockitoException → Exception 처리
참고링크
https://withseungryu.tistory.com/94
https://jwkim96.tistory.com/57
org.mockito.exceptions.base.MockitoException:
Checked exception is invalid for this method!
## 코드 1
...
when(서비스코드).thenThrow(new SQLException());
...
## 코드 2
...
when(서비스코드).thenThrow(new IOException());
...
원인
- SQLException 이나 IOException은 RuntimeException에 속하지 않은 Checked Exception임
- 기본적으로 Unchecked Exception이 가능
💡 CheckedException : 컴파일 전 예측 가능, throws를 통해 예외를 던지거나 try~catch를 이용해 예외를 처리 해줘야함(강제성 있음)
- CheckedException은 반드시 예외 처리해야 하며, 컴파일 시점에서 예외 발생이 확인
- CheckedException은 Error와 RuntimeException을 상속하지 않은 예외들을 모두 포함
- Error, FileNotFoundException, ClassNotFoundException 등이 대표적
- 스프링 프레임워크에서 CheckedException은 트랜젝션 처리 시에 예외 발생해도 롤백하지 않음
💡 UncheckedException : 컴파일 시 체크되지 않으며 프로그램 실행 도중 발생하는 예외도 예측 불가능, 반드시 throws를 통해 예외를 처리할 강제성이 없다
- UncheckedException은 명시적으로 예외 처리할 필요가 없으며, 런타임 시점에서 예외 발생이 확인 된다.
- UncheckedException은 RuntimeException을 상속받는 예외들을 포함
- NullPointerException, ClassCastException 등이 대표적
- 스프링 프레임워크에서 UncheckedException은 트랜젝션 처리시에 예외가 발생한 경우 롤백 수행
해결
- UncheckedException인 RuntimeException나 RuntimeException을 상속하는 exception 내에서 처리
- CheckedException으로 처리하고 싶으면 특정 서비스에 해당 ckecked 예외를 던질 수 있다고 선언해줘야함 ( #1 참고)
- 테스트 코드 내에도 뒤에 throws 해주기 (#2 참고)
#1 selectTestProc 메소드
public String selectTestProc(Telegram telegram) throws SQLException {
서비스코드 작성
return "";
}
#2 select 테스트 코드
...
@Test
@Order(1)
@DisplayName("[조회] 1. 실패")
void 조회_실패() throws SQLException {
select 테스트 코드 작성
}
...
2) org.opentest4j.AssertionFailedError → 예외발생 하지 않음
참고링크
https://yeonyeon.tistory.com/168
원인
- 예외가 발생할거라 생각해서 테스트 코드 작성했는데 예외가 발생하지 않았음
(※ 사실 엉뚱한 서비스 코드 불러와서 실행이 안된건데 이슈 발생 겸 정리)
해결
- 방법은 3가지가 있음
- 예외 전파하기
- 테스트하는 메소드 변경
- 테스트 코드 변경
3) mock으로 생성한 객체 beforeAll 동작X
- case1 : mock으로 객체 선언 & BeforeAll 선언
...
@Slf4j
@SpringBootTest
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@ExtendWith(MockitoExtension.class)
public class AddServiceTest {
@Mock
static Request addRequest;
...
@BeforeAll
static void makeAddRequest() {
// 객체 생성
}
@BeforeEach
void checkCommand() {
assertEquals(addKosRequest.getCommand(),"S121ADD");
}
...
- case2 : mock으로 객체 선언 & 각 유닛 테스트 모듈 내 aseetEquals 실행
...
@Slf4j
@SpringBootTest
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@ExtendWith(MockitoExtension.class)
public class AddServiceTest {
@Mock
static Request addRequest;
...
@Test
@Order(1)
@DisplayName("[가입] 1. 성공")
void 가입_성공() {
assertEquals(addRequest.getCommand(),"S121ADD");
....
}
...
원인
- mock으로 생성한 request 객체로 인해 beforeEach에서 명령어 체크 시 null로 나오는 문제
해결
- 우선 해당 소스에서는 request객체가 이미 구현되어있어서 굳이 mock을 사용하지 않아도 됐었음
- mock을 사용하는 경우 어떻게 해결할 수 있을지 확인 필요 → 각 모듈 내 객체를 하나씩 만들어서 진행해야할듯