본문 바로가기
T.I.L. :: Today I Learned/항해99 14기 본과정

Day 87. 코드 커버리지 70%가 눈 앞!

by DaSsom 2023. 6. 28.

인데? 코딩 말고 해야할 일이 꽤 많다. 최종 발표 영상도 준비해야하다보니 이 역시 피드백받고 수정하고 피드백 받고 수정하고 반복이다...

 

아무튼 오늘 테스트코드는 서비스 로직 이외에 다른 클래스도 구현해보기로 했다.

그 중에 Global Exception Handler

 

@DisplayName("Global Exception Handler 테스트")
@ExtendWith(MockitoExtension.class)
class GlobalExceptionHandlerTest {

    @Mock
    BindingResult bindingResult;
    @InjectMocks
    GlobalExceptionHandler globalExceptionHandler;

    @DisplayName("CustomException 클래스에서 발생하는 예외 핸들러 테스트")
    @Test
    void handleCustomException() {
        // Given
        CustomException exception = new CustomException(INTERNAL_SERER_ERROR);
        // When
        ResponseEntity<ErrorResponse> response = globalExceptionHandler.handleCustomException(exception);
        // Then
        assertEquals(exception.getErrorCode().getHttpStatus(), response.getStatusCode());
    }

}

 

이 클래스에서도 내가 원하는 예외를 하나 발생 시키고 핸들러를 통과하였을 때 나오는 반환값을 reponse로 받아서 둘을 검증하면 된다. 진짜 생각보다 매우 간단

 

@DisplayName("Valid 예외 핸들러 테스트")
    @Test
    void handleBindException() {
        // Given
        BindException bindException = new BindException(bindingResult);
        String errorMessage = "Validation failed.";
        when(bindingResult.getFieldErrors()).thenReturn(List.of(new FieldError("", "", errorMessage)));

        // When
        ResponseEntity<ErrorResponse> responseEntity = globalExceptionHandler.handleBindException(bindException);

        // Then
        assertEquals(HttpStatus.BAD_REQUEST, responseEntity.getStatusCode());
        ErrorResponse errorResponse = responseEntity.getBody();
        Assertions.assertNotNull(errorResponse);
        assertEquals(errorMessage, errorResponse.getMessage());
    }

 

Valid 예외 핸들러에서는 BindException이 필요해서 먼저 선언해주고 앞과 같이 when-thenReturn으로 원하는 값을 지정해줌

 

여기서 List.of의 사용법에 대해 알아보았다.

역시 인파님..!

 

🧱 Arrays.asList() 와 List.of() 차이 한방 정리

자바에서 리스트를 만드는 방법 자바에서 리스트를 만드는 방식은 대표적으로 3가지 정도 존재한다. 하나는 생성자로 직접 리스트 객체를 인스턴화 시키는 것이고, 좀 더 간편하게 원소가 들은

inpa.tistory.com

자바9 이후 버전에서 리스트를 만드는 방법이었다. 처음 아무것도 모르고 봤을땐 이게 뭔지, 왜 사용이 안되는지 궁금했는데 점차 아는 것이 많아지니 이런 것도 파악할 여유가 생긴다.

 

그리고 생각해보니 BindException은 한 번도 본 적이 없어서 어떤 경우에 생기는 예외인지 궁금해서 찾아보았다.

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/validation/BindException.html

 

BindException (Spring Framework 6.0.10 API)

Return the wrapped target object, which may be a bean, an object with public fields, a Map - depending on the concrete binding strategy. Register a field error for the specified field of the current object (respecting the current nested path, if any), usin

docs.spring.io

https://velog.io/@park2348190/Spring%EC%9D%98-Validation

 

Spring의 Validation

스프링 프레임워크에서는 객체를 검증할 때 Hibernate의 Validator나 직접 구현한 Validator 등을 사용할 수 있다. 현재 진행하고 있는 개인 프로젝트는 스프링 부트 기반이기 때문에 spring-boot-starter-valid

velog.io

흔히 만났던 Whitelabel Error Page가 나타났을 때 BindException이 터진거였나봄. 서버 소켓이 특정 포트에 바인딩을 시도할 때 해당 포트가 이미 다른 프로세스에 의해 사용중이거나 예약되어 있을 때 나타난다고 한다.

 

 

 

 

++ 최종영상 최최종 ~.~ 제출완룡 >.,<

https://youtu.be/DZXTt7peGaY

https://youtu.be/-ewfTAyn__A