작성
·
572
3
좋은 강의 정말 감사드립니다.
호돌맨님 강의덕분에 기존에 공부했던 지식들 정리도 하고 더 좋은 설계가 어떤건지 잘 배우고 있습니다.
제가 예외처리2 강의를 보고 컨트롤러 테스트를 하다가 게시글 작성 실패케이스에서 오류가 생겨서 질문드립니다.
PostController
PostCreate
PostControllerTest
글 작성 요청 시 제목, 내용 모두 null 인 케이스 테스트입니다.
이 테스트에서 실패합니다.
로그는 아래와 같습니다.
응답 바디에도 아무것도 오지 않습니다.
로그를 쫓아서 ErrorResponse 에 브레이크 포인트를 찍어봤습니다.
ErrorResponse
여기서 validation 이 null로 잡힙니다.
PostControllerAdvice
이쪽 ExceptionHandler 작성할 시점에
생성자에 validation 을 매개변수로 받지 않았을땐 오류가 발생하지 않았는데 validation 을 매개변수로 받고 나서 오류가 생기는거면
@Builder 가 ErrorResponse 의 validation 초기화를 무시하고 null 값으로 생기는 현상 같습니다.
그래서 따로 빌더 안붙인 validation 을 받지 않는 생성자를 만드니 잘 돌아갑니다.
그런데 강의 마지막에 전체 테스트 한번 돌리고 마무리 하신것 같은데 호돌맨님은 어떻게 테스트 실패가 안뜬건지 궁금합니다.
그리고 혹시 더 좋은 방법이 있는지 방향을 알려주시면 감사하겠습니다.
답변 1
1
안녕하세요. 호돌맨입니다.
질문을 남겨주셔서 감사합니다.
우선 해결 되셨다니 다행입니다.
코드를 보면
public class ErrorResponse {
// ...
private Map<String, String> validation = new HashMap<>();
}
현우님이 위와 같이 초기화 해도 생성자에서 validation null이 들어오면 NPE가 발생할 수 있습니다.
강의에서 ErrorResponse는 최종적으로 아래와 같이 변경되었습니다.
@Getter
public class ErrorResponse {
private final String code;
private final String message;
private final Map<String, String> validation;
@Builder
public ErrorResponse(String code, String message, Map<String, String> validation) {
this.code = code;
this.message = message;
this.validation = validation != null ? validation : new HashMap<>();
}
public void addValidation(String fieldName, String errorMessage) {
this.validation.put(fieldName, errorMessage);
}
}
빌더를 통해 ErrorResponse
생성시 validation값을 넘기지 않으면 null이 되기 때문에 체크를 해서 new HashMap<>()
으로 초기화를 시켰습니다. 그리고 final
이 추가 되었네요.
감사합니다.
앗 제가 따라치다가 놓쳤나봅니다. 다시 돌려보니까 이렇게 바껴있네요...
답변 감사합니다!
호돌맨님 강의 보면서 많은걸 배워갑니다. 좋은 강의 감사해요!
추석 잘 보내시길 바랍니다