오늘 및 주말 동안 한일은 다음과 같다.
1. ToDoServiceTest, CommnetServiceTest구현 및 ToDoControllerTest 구현
2. CommnetControllerTest, RepoSitoryTest, JwtutilTest 구현
1. 주말 동안 Service, Controller를 작성하면서 확실하게 어려웠던 부분은 Controller부분이었다.
Service부분은 Repository와 연결이 돼있기 때문에 실제 값을 넣어서 테스트하기 위해서는 BDDMyOngoingStubbing에서 지원하는 given이나 OngoingStubbing에서 지원하는 when 같은 명령어를 통해 테스트 코드를 작성해야 하는데 둘 다 사용하지만 given이 더 현실감이 있어서 주로 사용했고 주로 한 기능은 서비스 내부의 return값과 로직중간에 핵심적으로 들어가는 내용만 테스트를 진행했다. given을 사용하면서 주로 사용했던 내용은 any() 메서드였는데 any메서드는 어떤 값이든 허용한다라는 의미를 가지고 있다. 만약 any메서드 안에 클래스를 넣으면 해당하는 클래스의 어떤 값을 허용한다는 의미가 된다. 아래의 예시와 같다.
ex)
// 어떤 입력값이든 상관없을때
given(cardService.createCard(any(),any())).willretrun(반환 값)
// 값의 클래스를 제한하고 싶을때
given(cardService.createCard(any(Card.class),any(User.class))).willretrun(반환 값)
// 특정한 값을 넣어야 할때
given(cardService.createCard(card,user).willreturn(반환 값)
마지막의 willreturn은 given의 주어진 레이어를 통과했을 때 반환되는 값이다. 따라서 저 해당하는 레이어를 통해 값을 조작할 수 있다.
위의 메서드를 통해 Controller나 Service에서 레이어에 따라 반환되는 갑을 설정하고 해당하는 응답을 테스트를 할 수 있었다.
Controller 부분은 위에서 설명했던 given + JSON을 동시에 사용하면서 테스트를 완성해야 돼서 Controller를 처리하기 힘들었다. JSON데이터는 ObjectMapper를 통해 변환 후 Controller의 입력값으로 주고 테스트할 때는 ResultActions를 통해 특정값이나 Http status를 체크를 할 수 있다. 생각해야 될게 Service보다 2배로 많아서 힘들었다.
2. CommentControllerTest를 작성하면서 에러를 발견했는데 에러는 다음과 같다.
발생한 에러는 아래의 사진처럼 Controller에 JSON데이터를 보냈는데 헤더에 값이 안 들어간 이미지이다.
위의 헤더값이 빈값에 따라 아래 이미지는 실패에러가 뜬 이미지이다
에러가 발생하고 나서 Request에 문제가 있다고 생각해서 CommentRequestDto로 들어가서 확인을 해보니 문제는 없어 보이지만 RequiredArgsConstructor어노테이션으로 생성자가 있기에 String데이터를 직렬화하는 과정에서 생성자 인식을 못해 JSON 데이터로 변환할 수 없는 문제가 발생했다.
Spring에서는 Servelt이 이것을 대신해 주는데 Test환경에선 이걸 수동으로 하기 때문에 위에서 언급했던 ObjectMapper를 사용하여 JSON데이터로 변환해야 된다. 근데 여기서 더 신기한 문제는 필드값이 2개 이상이면 JSON으로 변환이 됐다. 하지만 CommentRequestDto는 필드값이 정해져 있기 때문에 다른 방법을 찾아야만 했다.
아래의 이미지 방법을 통해 해결을 했다. 모든 생성자와 기본생성자를 통해 어떤 상태든 일단 생성자로 어떻게든 직렬화로 만들었다. 이렇게 설정을 하니 문제는 해결됐지만 위의 이미지에서 발생했던 문제는 이해가 안 됐다. 스프링내부를 전부 보면서 확인을 해야 돼서 그냥 체념했다.
개인과제로 진행했던 프로젝트의 테스트 코드를 짜보면서 이태 했던 것 중 제일 어려웠지만 차근차근 하나하나 해결하다 보니 모든 테스트는 아니지만 핵심적인 테스트 코드를 완성했다.
'내일 배움 캠프' 카테고리의 다른 글
2023-12-06 (1) | 2023.12.06 |
---|---|
2023-12-05 (2) | 2023.12.06 |
2023-12-01 (2) | 2023.12.01 |
2023-11-30 (0) | 2023.12.01 |
2023-11-29 (1) | 2023.11.29 |