TIL

테스트 코드 작성

Mon Groy 2024. 7. 5. 20:00

테스트를 한다는 것은 원하는 "결과"가 나오는지 "검증" 하는 것이므로

검증할 사항을 위한 조건들을 생성하고 그 결과를 보면 되는 것이다

 

테스트 코드를 할 때 어렵게 느껴졌던 부분은 Mock 이다

이유는, mock 이 어디까지 반영이 되는 존재인지를 잘 파악하지 못해서이다


리팩토링

 

효율적인 Test를 위해서는 리팩토링을 피할 수 없다

단순 CRUD 를 담당하는 클래스와 검증이 필요한 (단순 CRUD가 아닌) 메서드를 분리하는 것이 중요하다

이렇게 Mock 이 필요없는 부분을 떼어놓은 후엔 POJO 테스트라고 불리는 것을 할 수 있게 된다

 

또한 Mock 이 필요한 경우라도 "단순" CRUD 는 굳이 테스트를 할 필요도 없다


 

리팩토링이 끝나고 POJO 테스트 코드 작성을 하려고 하는데

객체를 생성해야 하는 일이 여간 귀찮은 일이 아니다

더 간단히 생성하는 방법이 있을까 싶어서 구글링을 해봤지만

예시들이 모두 간단한 것들 뿐이었다

 

Dto 는 입력할 내용이 상대적으로 적기때문에

for 문으로 Dto 를 생성했고, user의 매개변수에 넣어주었다

consumerRequestDtoList = new ArrayList<>();

       for (int i = 0; i < 3; i++) {

        ConsumersSignupRequestDto consumerRequestDto = new ConsumersSignupRequestDto(

        "email" + i + "@g.com", "password" + i, "User" + i,

        "Nickname" + i, "Address" + i);

 

        consumerRequestDtoList.add(consumerRequestDto);

}

 

그렇게 thanks 등록이 성공적으로 진행되는 것을 확인한 것 까지는 좋았으나,

thanks 를 한 번 더 누를 경우 thanks 등록이 취소 처리되는 경우를 상정하여 테스트 하였는데 실패했다

Review의 Id 부분이 nullPointException 이 뜬 것이다

 

아무리 service 메서드를 손보아도 exception이 발생했다

더 이상 손 볼 일이 없다고 판단되어 테스트 코드 추가 특강을 진행해주셨던 튜터님을 찾아갔다

 

어떤 상황인지 파악(전체 로직 흐름 중 어느부분을 테스트 하는 것인지 확인, 문제가 발생한 부분 확인)하실 때

등록만 할 때는 성공이 뜨는데, 취소를 진행하기 위해 같은 로직을 태웠을 때 실패가 뜨는(Exception이 발생하는) 상황임을 말씀드렸다

 

바로 디버그 모드를 진행했다

확인하니 Review id가 null로 뜨고 있었다

Dto를 통해서 Review를 생성하고, 그걸 받아서 thanks 등록을 진행하는데

생성자에 Review 의 id 가 생성되도록 짜여져 있지가 않은 것이 문제였다

 

처음 한 번 thanks 를 눌렀을 때

thanks 등록이 성공하는 이유는 getThanksList() 를 할 때 null 이어서 바로 등록하는 부분으로 넘어가기 때문이었고

두 번째 thanks 를 눌렀을 때

thanks 등록이 성공하지 못하는 이유는 id 가 없는 Review의 id 를 얻으려고 하므로 null 이 떠서 에러가 발생한 것이었다

 

따라서 Review의 생성자를 지우고 builder를 적용하기로 했다

생성자를 지운 대신 AllArgsConstructor도 설정해 주었다

 

그리고 테스트 코드 안에 id를 부여하여 Review 를 생성했고

thanks 취소 테스트를 무사히 완수했