스프링에서 테스트가 익숙치 않은데 그 중에서도 더 익숙하지 않은 경우는 controller test이다..
mock으로 직접 설정하고 해야하기에..
@Test
@DisplayName("createNewAccessToken() : 새로운 액세스 토큰을 발급한다.")
void createNewAccessToken() throws Exception {
//given
final String url = "/api/token";
User testUser = userRepository.save(User.builder()
.email("user@email.com")
.password("test")
.build());
String refreshToken = JwtFactory.builder()
.claims(Map.of("id", testUser.getId()))
.build()
.createToken(jwtProperties);
refreshTokenRepository.save(new RefreshToken(testUser.getId(), refreshToken));
CreateAccessTokenRequest request = new CreateAccessTokenRequest();
request.setRefreshToken(refreshToken);
final String requestBody = objectMapper.writeValueAsString(request);
//when
ResultActions resultActions = mockMvc.perform(post(url)
.contentType(MediaType.APPLICATION_JSON_VALUE)
.content(requestBody));
resultActions.andExpect(status().isCreated())
.andExpect(jsonPath("$.accessToken").isNotEmpty());
}
테스트 내용은
토큰이 들어온다면, 201과 accessToken이 있는 지 검증하는 결과이다.

그 과정에서 항상 헷갈리는 것이 objectmapper와 mockMvc
1. ObjectMapper
ObjectMapper는 Jackson 라이브러리에서 제공하는 클래스로,
Java 객체와 JSON 변환(직렬화 & 역직렬화)을 도와줌
ObjectMapper는 @RestController에서 기본적으로 사용되고,
Spring Boot의 @RestController는 내부적으로 ObjectMapper를 사용해서
컨트롤러의 반환 객체를 자동으로 JSON으로 변환해준다.
왜 ObjectMapper가 필요한가?
HTTP 요청의 본문(body)은 JSON 형식
- MockMvc로 테스트할 때, 요청 본문(body)을 JSON 형식으로 보내야 함.
- objectMapper.writeValueAsString(request)를 사용하면 Java 객체를 JSON 문자열로 변환하여 요청 본문으로 사용할 수 있음.
Spring MVC 컨트롤러는 JSON을 객체로 변환해야 함
- 컨트롤러에서 @RequestBody CreateAccessTokenRequest request 같은 파라미터를 받을 때,
Spring은 JSON 데이터를 자동으로 객체로 변환해줌. - 이때 내부적으로 ObjectMapper가 동작해서 JSON을 CreateAccessTokenRequest 객체로 바꿔줌.
즉! 직렬화와 역직렬화를 해주는 객체와 Json의 변환을 담당!
(자동으로 controller에서 해주다보니, 간과할 때가 많다ㅠ)
'프로젝트' 카테고리의 다른 글
블로그 만들기 - cookie와 util 클래스를 static으로? (0) | 2025.03.30 |
---|---|
블로그 만들기 - 환경변수 dotenv으로 관리 (0) | 2025.03.30 |
블로그 만들기 - jwt TokenProvider 테스트 오류 (0) | 2025.03.26 |
블로그 만들기 - spring Security 로그아웃 (0) | 2025.03.20 |
블로그 만들기 - Spring security - CSRF (0) | 2025.03.04 |