일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- GitHub
- 내일배움캠프
- #내일배움캠프
- JVM
- diary
- 포맷은 최후의 보루
- #스파르타내일배움캠프
- Diary 해우소
- 성장기록
- 스파르타내일배움캠프
- 클래스
- TiL_1st_0419
- 해우소
- #스파르타내일배움캠프TIL
- 메서드
- Java의 이점
- static
- Token
- 스파르타내일배움캠프TIL
- 인스턴스
- 스레드
- Java
- 회고록
- Git
- 객체지향 언어
- Github_token
- 변수의 다양성
- 감사기록
- KPT
- 생성자
- Today
- Total
몬그로이
테스트 코드 작성 본문
테스트를 한다는 것은 원하는 "결과"가 나오는지 "검증" 하는 것이므로
검증할 사항을 위한 조건들을 생성하고 그 결과를 보면 되는 것이다
테스트 코드를 할 때 어렵게 느껴졌던 부분은 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 취소 테스트를 무사히 완수했