작성
·
167
0
배경
회원가입을 할 때, 이메일로 인증한 회원만 회원가입이 진행되도록 하는 구현중에 있습니다.
그래서, 이메일로 인증한 회원에 한해서 MAIL_VERIFIED_MEMBER
세션을 만들어서 반환하고, 회원가입할 때 MAIL_VERIFIED_MEMBER
세션이 있는지 확인하고자 합니다.
그래서, 이메일로 인증한 회원에 MAIL_VERIFIED_MEMBER
세션이 잘 들어가는지 Controller 테스트를 진행하고자 하는데, 어려움을 겪어서 질문드립니다.
이메일로 인증한 회원에 MAIL_VERIFIED_MEMBER
세션을 넣어주는 API이며, 이 api 를 테스트 하고자 합니다.
@PostMapping("/email/authenticate")
public ApiResponse<Void> authenticateEmail(@RequestBody @Valid EmailAuthenticationRequest request, HttpServletRequest servletRequest) {
// 메일 인증한 회원에게 세션을 추가한다
if (mailService.isValidMail(request.toServiceRequest())) {
HttpSession session = servletRequest.getSession();
session.setAttribute(MAIL_VERIFIED_MEMBER, true);
return ApiResponse.ok();
}
return ApiResponse.status(HttpStatus.BAD_REQUEST);
}
테스트 코드를 아래 사진처럼 짜보았습니다
.
그러자, Response should contain header 'Set-Cookie' 라는 오류와 함께 테스트가 실패하게 됩니다.
Postman 으로 api 를 호출하면 Set-Cookie 헤더에 JSESSIONID 값이 잘 들어 오는 것을 확인하였습니다.
그러나, 테스트로 진행하면 JSESSIONID 도 무작위 값이 아닌 1, 2 로 들어오게 되어 'api 호출 후 세션이 생성되어 쿠키에 들어갔는지' 테스트하는데 어려움을 겪어 질문 드립니다...ㅠㅠ
api 호출 후, 응답에 세션과 쿠키가 잘 생성 되었는지를 테스트하려면 어떻게 해야할까요..?
andDo(print()) 에서 MockHttpServletRequest 의 Session Attrs 에는 세션 값이 왜 들어가 있을까요.. 해당 api 를 호출하면 세션이 아직 생성이 안되었을 것이라 생각했기 때문입니다..
해당 테스트를 실행할 때의 andDo(print()) 의 결과는 다음과 같습니다.
MockHttpServletRequest:
HTTP Method = POST
Request URI = /member/email/authenticate
Parameters = {}
Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"48"]
Body = {"email":"123@naver.com","authCode":"312nj5acz"}
Session Attrs = {verified_member=true}
MockHttpServletResponse:
Status = 200
Error message = null
Headers = [Content-Type:"application/json"]
Content type = application/json
Body = {"code":"0200","status":"OK","message":"OK","data":null}
Forwarded URL = null
Redirected URL = null
Cookies = []
질문이 길어 죄송합니다..
그리고, 좋은 테스트 강의를 지식 공유 해주셔서 감사드립니다!!
답변 2
1
안녕하세요, 종혁 님!
하나씩 답변 드리겠습니다.
1. api 호출 후, 응답에 세션과 쿠키가 잘 생성 되었는지를 테스트하려면 어떻게 해야할까요..?
원하시는 케이스가 잘 검증되는지 시도해 보셔야겠지만, set-cookie 헤더를 검증하는 것 대신 cookie()라는 헬퍼 메서드가 있습니다.
.andExpect(cookie()...)
한번 살펴보셔요 ㅎㅎ
2. andDo(print()) 에서 MockHttpServletRequest 의 Session Attrs 에는 세션 값이 왜 들어가 있을까요.. 해당 api 를 호출하면 세션이 아직 생성이 안되었을 것이라 생각했기 때문입니다..
요건 조금만 더 생각해보면 당연한 현상인데요 ㅎㅎ
print()를 요청/응답이 모두 완료된 후에 했기 때문에 request에 세션이 존재하는 형태로 print 된 것이 자연스럽습니다.
도움이 되셨기를 바랍니다.
감사합니다 ☺
0
안녕하세요, 인프런 AI 인턴입니다.
JWT나 Session/Cookie를 테스트할 때는 실제 어플리케이션에서 발급하고 관리하는 방식을 모의해서 테스트 코드 내에서 구현해야 합니다. 특히, 세션과 쿠키는 HTTP 통신의 상태를 유지 관리하기 위해 사용되므로, 이를 테스트 코드에서 잘 다루기 위해서는 몇 가지 포인트를 고려해야 합니다.
세션과 쿠키 생성 확인: Spring의 MockMvc
를 사용하여 테스트를 진행할 때, .andExpect()
메서드를 통해 응답 헤더의 존재 여부와 특정 값을 검증할 수 있습니다. Set-Cookie
헤더를 통해 세션 쿠키(JSESSIONID
)가 설정되었는지 확인할 수 있습니다. 만약, JSESSIONID
값이 테스트마다 고정된 값을 가지는 경우, 테스트 환경에 따라 세션 관리 방식이 달라지므로, 실제 값보다는 해당 헤더의 존재 여부를 확인하는 것이 중요합니다.
andDo(print())
에서의 세션 값: andDo(print())
의 결과에서 세션 값이 출력되는 것은, MockMvc
테스트에서 실제 HttpServletRequest의 모의 객체를 사용하기 때문입니다. 이 모의 객체는 실제 어플리케이션의 HTTP 요청을 흉내 내므로, API 호출로 인해 세션에 값이 설정되면, 해당 세션 값이 MockHttpServletRequest
에도 반영됩니다. 따라서, 테스트에서 해당 API를 호출할 때마다 세션 값이 생성되고 관리되는 것을 볼 수 있습니다.
테스트 코드에서 Set-Cookie
헤더의 존재 여부를 확인하는 방법을 예시로 설명하겠습니다. 아래는 테스트 코드에서 응답 헤더에 Set-Cookie
가 포함되어 있는지 확인하는 간단한 방법입니다:
mockMvc.perform(post("/email/authenticate")
.contentType(MediaType.APPLICATION_JSON)
.content("{\"email\":\"123@naver.com\",\"authCode\":\"312nj5acz\"}"))
.andExpect(status().isOk())
.andExpect(header().exists("Set-Cookie")) // Set-Cookie 헤더의 존재 여부를 확인
.andDo(print());
이 방법을 통해 API 호출 후 응답에 세션이 잘 생성되었는지를 간단히 확인할 수 있습니다. 하지만, 실제 쿠키의 값까지 정확하게 테스트하기 위해서는 별도의 설정이나 상황에 따른 구현이 필요할 수 있습니다.
테스트 환경에서의 세션과 쿠키를 다루는 것은 실제 서비스의 동작을 정확히 모의하기 위해 중요한 부분입니다. 위의 정보들이 종혁님의 테스트 구현에 도움이 되기를 바랍니다.