늦은 프로그래밍 이야기

221229 TIL 본문

내일배움캠프/TIL, WIL

221229 TIL

한정규 2022. 12. 30. 00:03

Spring

Spring Test

2022.12.29 - [내일배움캠프/Spring] - Spring Test

 

Spring Test

Spring Test 테스트 코드가 왜 필요한가 궁극적 목표 테스트 코드를 작성하는 이유는 잘 동작하는 깔끔한 코드를 얻기 위해서이다. 테스트 코드를 작성하면 깔끔한 코드를 얻을 수 있는 이유 테스

jk891113.tistory.com

테스트 코드 작성 방법에 대해 강의를 들었다. 테스트 코드가 왜 필요한지 강의에서는 자세히 설명하지 않아서 검색을 통해 알아보았다. 그동안 프로젝트를 진행하면서 코드를 수정하기만 하면 DB를 계속 불러와 회원가입부터 시작해서 원하는 곳까지 계속 반복적으로 테스트를 하고 기능들이 많아질수록 테스트 해야 하는 시간이 점점 길어지며 겪었던 불편함들이 적혀 있었고, 테스트 코드를 작성함으로써 그러한 불편한 점들을 해결할 수 있을거란 말에 공감이 되었다.

 

TDD 방법론에 대해서도 배웠고, 테스트 코드를 먼저 작성하고 개발하는 방법론이라고 한다. 아직 테스트 코드를 제대로 작성할 줄 몰라서 아직은 시도해보지 못할 것 같다.

 

테스트 코드를 작성하는 가장 대표적인 방법론인 Given - When - Then Pattern에 대해서도 배웠는데, Given (준비), When (실행), Then (검증) 한글 용어가 살짝 직관적이지 않다. 그래서 데이터를 준다, 실행할 때, 그 다음 검증으로 생각하니 조금 괜찮아진 것 같다.


테스트 클래스와 예외 처리의 클래스가 같지 않아서 발생한 오류

기존에 프로젝트를 진행했던 코드에 테스트 코드를 사용해 보았다. User 클래스에 적용해 보았는데 성공 케이스는 잘 테스트 되었는데, 실패 테스트에서 Null인 경우의 예외를 설정하지 않아서 테스트를 할 수 없었다.

 

빠르게 Null인 경우에 대한 예외처리를 작성하였다.

// UserService CLASS
if (username == null) {
	  throw new IdentifierGenerationException("아이디를 입력하세요.");
}

// ExceptionHandler CLASS
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
@org.springframework.web.bind.annotation.ExceptionHandler(IdentifierGenerationException.class)
public ResponseEntity<StatusResponseDto> IdentifierGenerationExceptionHandler(IdentifierGenerationException e) {
    StatusResponseDto responseDto = new StatusResponseDto(StatusEnum.BAD_REQUEST, e.getMessage());
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
    return new ResponseEntity<>(responseDto, headers, HttpStatus.BAD_REQUEST);

해당 예외처리에 대한 실패 케이스 테스트 코드를 작성하였다.

@Nested
@DisplayName("실패 케이스")
class FailCases {
    @Nested
    @DisplayName("username")
    class username {
        @Test
        @DisplayName("null")
        void fail() {
            // given
            username = null;
            // when
            Exception exception =assertThrows(IdentifierGenerationException.class, () -> {
                new User(username, password, role);
            });
            // then
            assertEquals("아이디를 입력하세요.", exception.getMessage());
        }

to be thrown, but nothing was thrown. 에러가 발생하면서 테스트가 성공하지 못했다. 예외가 발생해야 하는데 예외가 발생하지 않았다는 오류인 것 같다. 살짝 당황은 했지만, 당황하지 않고 해결 해보도록 한다.

 

테스트 코드가 잘못된 것 같지 않고, 디버깅을 해봐도 값은 설정한대로 동일하게 들어오는 것을 확인하였다. 전역 예외처리도 주석처리 해보고 이런저런 방법을 시도해 보다가 User 클래스에 대한 테스트 클래스를 만들었는데 UserService에서 throw 해서 테스트 코드에서 찾지 못한게 아닌가 하는 생각이 들어서 User 클래스의 생성자에 throw를 넣어 보았더니 테스트에 성공을 하였다.

// User CLASS
public User(String username, String password, UserRoleEnum role) {
    this.username = username;
    this.password = password;
    this.role = role;
    if (username == null) {
        throw new IdentifierGenerationException("아이디를 입력하세요.");
    }
}

이런 방식은 저번에 양방향 연관관계에서 DTO를 작성하여 순환참조를 제거하는 부분에서 이런 식으로 엔티티의 생성자 안에 작성을 했었는데 예외 처리도 이렇게 작성을 해도 되는건지는 의문이다. 내일 한번 질문해서 확실히 알고 넘어가는게 좋을듯 하다.


'내일배움캠프 > TIL, WIL' 카테고리의 다른 글

9주차 WIL  (0) 2023.01.01
221230 TIL (Git, 팀프로젝트)  (0) 2022.12.31
221228 TIL  (0) 2022.12.28
221227 TIL  (0) 2022.12.27
221226 TIL (FetchType)  (0) 2022.12.26
Comments