ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [TDD] 이슈정리
    개발공부/ISSUE 2022. 10. 14. 10:36

    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가지가 있음
      1. 예외 전파하기
      2. 테스트하는 메소드 변경
      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을 사용하는 경우 어떻게 해결할 수 있을지 확인 필요 → 각 모듈 내 객체를 하나씩 만들어서 진행해야할듯
Designed by Tistory.