스프링/5. 스프링 DB-1

32. 예외 테스트

sdafdq 2023. 10. 2. 13:03

이거는 스프링에 대한 것 이라기 보다는, 스프링이 제공해주는 테스트 기능을 이용해서 예외 그냥 일부로 던져보는 거임.

 

 

@Slf4j
public class CheckedTest {
    @Test
    void checked_catch(){
        Service service = new Service();
        service.callCatch();
    }

    @Test
    void checked_throw() throws MyCheckedException {
        Service service = new Service();
        assertThatThrownBy(()->service.callThrow()).isInstanceOf(MyCheckedException.class);
    }
    static class MyCheckedException extends Exception{
        public MyCheckedException(String message) {
            super(message);
        }
    }

    static class Service{
        Repository repository = new Repository();

        public void callCatch(){
            try{
                repository.call();
            }catch (Exception e){
                log.info("예외처리, message={}",e.getMessage(),e);
            }
        }

        public void callThrow() throws MyCheckedException {
            repository.call();
        }
    }

    static class Repository{
        public void call() throws MyCheckedException {
            throw new MyCheckedException("ex");
        }
    }
}

먼저 리포지토리부터 보면,

예외를 그냥 던지게 함.

우리가 먼저 JDBC 리포지토리 할 때도 SQLException 해서 예외 던졌었음. 아무래도 DB가 외부에 있는 거 연결하는 거다 보니까 예외처리 해야 하는 건 거의 확정적인 듯..

 

여튼 그 다음 서비스를 보면,

callCatch는 try catch해서 그냥 잡은거임.

callThrow()는 안 잡고 밖으로 던져버린거.

 

MyCheckedException은 그냥 커스텀으로 예외 만든 거.

 

아 그리고 예외 받거나 던질 때 Exception으로 하는 경우는 잘 없음.

거의 모든 예외를 처리한다는 의미이므로, 예외는 구체적으로 하는 게 좋은 듯.

 

checked_catch() 테스트는 callCatch()가 try catch로 예외 처리를 했으므로 정상작동.

 

checked_throw()는 callThrow()가 던져서 에러.. 나겠지만 assertThatThrownBy()로 예외처리가 나야지 정상작동.

assertThatThrownBy()가 예외를 받는 테스트 메소드니까. 아마 내부에서 try catch 해서 처리 했겠지.

근데 instanceof 해서 인자로 넣어준 에러 클래스의 인스턴스가 아니면 또 throw new 해서 AssertionError라고 또 뿜음.

 

 

'스프링 > 5. 스프링 DB-1' 카테고리의 다른 글

34. 체크예외 활용  (0) 2023.10.03
33. 언체크 예외  (0) 2023.10.03
31. 예외 기본 규칙  (0) 2023.10.02
30. 자바 예외  (0) 2023.10.02
29. 스프링 부트 자동 리소스 등록  (0) 2023.10.01