JUnit 테스트 - JwtAuthenticationFilter 테스트

jeongjin-kim·2023년 7월 18일

JUnit5

목록 보기
4/11
post-thumbnail

최주호 강사님의 인프런 강좌 정리 및 실습한 기록

목적

  • JwtAuthentcationFilter 의 동작 과정을 복습하고, 잘 동작하는지 테스트한다.

구현에 필요한 내용

  • @ActiveProfiles("test") 어노테이션을 이용하여 application-test.yml 파일을 적용되도록 변경
  • @BeforeEach 어노테이션을 활용해서 테스트 직전 데이터 1건 넣기
  • MockMvc 클래스 의존성 주입
    - @AutoConfigureMockMvc 어노테이션을 사용해야 MockMvc 클래스를 사용할 수 있다.
  • DummyObject 클래스를 상속받아서 간단하게 테스트용 유저를 생성한다.
  • MockMvc 환경에서 POST 요청, response 를 어떻게 테스트 하는지 알아본다.
  • @Transactional 적용

ActiveProfiles("test")

application-test.yml 에 log 레벨을 trace 로 바꿔서 좀 더 상세한 로그를 살펴본다.

application-test.yml

trace 모드인 경우, 쿼리문에 들어가는 실제 데이터 값을 확인할 수 있다.

logging:
  level:
    '[jj.study.bank]': DEBUG
    '[org.hibernate.type]': TRACE

DummyObject

테스트에 사용할 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"));

}

결과

0개의 댓글