1. 통합 테스트 (Integration Test)

2**. 단위 테스트 (Unit Tests)**

컨트롤러 (Controller)

/**
 * 사용자 기본 로그인 성공
 */
@Test
public void 기본_로그인_성공() throws Exception {
    // given
    final LoginRequest request = LoginRequestBuilder.build();
    final Authentication expectedAuthentication = new UsernamePasswordAuthenticationToken(request.email(), null, Collections.singleton(new SimpleGrantedAuthority(Role.ROLE_CUSTOMER.name())));
    final TokenInfoResponse expectedResponse = TokenInfoResponseBuilder.build();

    // stub
    when(userAuthService.authenticateBasic(any())).thenReturn(expectedAuthentication);
    when(userAuthService.login(any(), any())).thenReturn(expectedResponse);

    // when
    final ResultActions resultActions = requestLoginBasic(request);

    // then
    final String responseString = resultActions
            .andExpect(status().isOk())
            .andReturn().getResponse().getContentAsString(StandardCharsets.UTF_8);

    final TokenInfoResponse actualResponse = objectMapper.readValue(responseString, TokenInfoResponse.class);
    TokenInfoResponseBuilder.assertTokenInfoResponse(actualResponse, expectedResponse);
}

private ResultActions requestLoginBasic(LoginRequest request) throws Exception {
    return mvc.perform(post("/user/login")
                    .contentType(MediaType.APPLICATION_JSON)
                    .content(objectMapper.writeValueAsString(request)))
            .andDo(print());
}

서비스 (Service)

/**
 * 거래 DB id 에 해당하는 거래의 접근 권한 확인 성공 - 공장 사용자
 */
@Test
public void checkAuthorityCustomerOfOrderOrFactory_성공_Factory() {
    // given
    final UserEntity userEntity = UserEntityBuilder.factoryAdminUserBuild();
    final Long orderId = 1L;

    // stub
    when(userAuthService.getUserByEmail(userEntity.getEmail())).thenReturn(userEntity);

    // when
    orderService.checkAuthorityCustomerOfOrderOrFactory(userEntity.getEmail(), orderId);
}
/**
 * 사용자 Refresh Token 을 활용한 Access Token 재발급 성공
 */
@Test
public void reissue_성공() {
    // given
    final RefreshToken refreshToken = RefreshToken.builder()
            .id("[email protected]")
            .ip(NetworkUtil.getClientIp(httpServletRequest))
            .authorityList(List.of(Role.ROLE_CUSTOMER.name(), Authority.AUTHORITY_ADMIN.name()))
            .refreshToken("refreshToken")
            .build();

    final TokenInfoResponse expectedResponse = TokenInfoResponseBuilder.build();

    // stub
    when(jwtProvider.validateToken(refreshToken.getRefreshToken())).thenReturn(true);

    when(refreshTokenRedisRepository.findByRefreshToken(refreshToken.getRefreshToken())).thenReturn(Optional.of(refreshToken));
    when(jwtProvider.generateToken(refreshToken.getId(), refreshToken.getAuthorityList())).thenReturn(expectedResponse);

    // when
    final TokenInfoResponse actualResponse = userAuthService.reissue(httpServletRequest, refreshToken.getRefreshToken());

    // then
    Assertions.assertThat(actualResponse).isEqualTo(expectedResponse);
}
/**
 * 거래 DB id 에 해당하는 거래의 접근 권한 확인 실패
 * - 실패 사유 : 접근 권한 없음
 */
@Test
public void checkAuthorityCustomerOfOrderOrFactory_실패_DENIED_ACCESS_TO_ORDER() {
    // given
    final UserEntity userEntity = UserEntityBuilder.build();
    final Long orderId = 0L;
    final String userEmailOfOrder = "[email protected]";

    // stub
    when(userAuthService.getUserByEmail(userEntity.getEmail())).thenReturn(userEntity);
    when(orderRepository.findUserEmailById(orderId)).thenReturn(Optional.of(userEmailOfOrder));

    // when & then
    Assertions.assertThatThrownBy(() -> orderService.checkAuthorityCustomerOfOrderOrFactory(userEntity.getEmail(), orderId))
            .isInstanceOf(CustomCommonException.class)
            .hasMessage(OrderErrorCode.DENIED_ACCESS_TO_ORDER.getMessage());
}