
최주호 강사님의 인프런 강좌 정리 및 실습한 기록
@ActiveProfiles("test") 어노테이션을 이용하여 application-test.yml 파일을 적용되도록 변경@BeforeEach 어노테이션을 활용해서 테스트 직전 데이터 1건 넣기MockMvc 클래스 의존성 주입@AutoConfigureMockMvc 어노테이션을 사용해야 MockMvc 클래스를 사용할 수 있다. DummyObject 클래스를 상속받아서 간단하게 테스트용 유저를 생성한다. MockMvc 환경에서 POST 요청, response 를 어떻게 테스트 하는지 알아본다.@Transactional 적용application-test.yml 에 log 레벨을 trace 로 바꿔서 좀 더 상세한 로그를 살펴본다.
trace 모드인 경우, 쿼리문에 들어가는 실제 데이터 값을 확인할 수 있다.
logging:
level:
'[jj.study.bank]': DEBUG
'[org.hibernate.type]': TRACE
테스트에 사용할 AppUser 객체를 생성하는 클래스
반복적으로 사용되는 부분을 분리한다.
public class DummyObject {
protected AppUser newAppUser(String username, String fullname) {
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String encPassword = passwordEncoder.encode("1234");
return AppUser.builder()
.username(username)
.password(encPassword)
.email(username + "@nate.com")
.fullname(fullname)
.role(AppUserEnum.CUSTOMER)
.build();
}
}
로그인 후 토큰을 잘 받아오는지 테스트한다.
시큐리티 강의가 아니기 때문에, 만료시간 체크 후 토큰 재발급, refresh token 관련 내용은 없다. 해당 내용은 추후 MSA 프로젝트를 하면서 정리할 것이다.
@Test
@DisplayName("test-successfulAuthentication")
void successfulAuthentication() throws Exception {
// [given]
LoginRequestDTO loginRequestDTO = new LoginRequestDTO();
loginRequestDTO.setUsername("ssar");
loginRequestDTO.setPassword("1234");
String requestBody = objectMapper.writeValueAsString(loginRequestDTO);
System.out.println(requestBody);
// [when]
ResultActions resultActions = mockMvc.perform(post("/api/login")
.content(requestBody)
.contentType(MediaType.APPLICATION_JSON)
.characterEncoding(StandardCharsets.UTF_8));
String responseBody = resultActions.andReturn().getResponse().getContentAsString();
// jwt 토큰의 header 추출
String jwtToken = resultActions.andReturn().getResponse().getHeader(JwtVO.HEADER);
System.out.println("responseBody: " + responseBody);
System.out.println("jwtToken: " + jwtToken);
// [then]
// 정상적인 상태인지 (=200) 검증
resultActions.andExpect(status().isOk());
// jwt token 이 null 인지 검증
assertNotNull(jwtToken);
// Bearer 토큰인지 검증
// JwtVO.TOKEN_PREFIX -> 'Bearer '
assertTrue(jwtToken.startsWith(JwtVO.TOKEN_PREFIX));
// jsonPath 를 사용해서 특정한 json value 값을 확인한다.
resultActions.andExpect(jsonPath("$.data.username").value("ssar"));
}
