@PostMapping("/{menuId}")
public ResponseEntity<CommonResponseDto<OrderResponseDto>> sendOrder(
@PathVariable(name = "menuId") Long menuId,
@AuthenticationPrincipal UserAuth auth) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(
CommonResponseDto.of(
OrderSuccessCode.ORDER_CREATE_SUCCESS,
orderService.sendOrder(menuId, auth)
)
);
}
일부러 return할 때, ResponseEntity.status(BAD_REQUEST)
로 설정해봤다.
@WebMvcTest(OrderController.class)
@ActiveProfiles("test")
class OrderControllerTest {
@Autowired
MockMvc mockMvc;
@MockitoBean
OrderService orderService;
@MockitoBean
private JwtAuthenticationFilter jwtAuthenticationFilter;
@DisplayName("새로운 주문을 요청(생성)합니다.")
@Test
@WithMockUser(username = "wannabeing")
void sendOrder() throws Exception {
// given
...
// when & then
mockMvc.perform(MockMvcRequestBuilders
.post("/api/orders/{menuId}", 1L)
.contentType(MediaType.APPLICATION_JSON)
.with(csrf()))
.andDo(print())
.andExpect(status().isCreated());
}
}
.with(csrf())
는 Spring Security가 CSRF 보호를 사용하는 경우,아니.. 성공해서 기분이 좋긴 하다만 BAD_REQUEST
면 400이 떠야하는데..
무조건 200이 뜨는 상황이 발생해버렸다.. 어디가 문제였을까?
@WebMvcTest(OrderController.class)
@ActiveProfiles("test")
class OrderControllerTest {
@Autowired
MockMvc mockMvc;
@MockitoBean
OrderService orderService;
// ✅ 이 부분이 문제였다!!!
@MockitoBean
private JwtAuthenticationFilter jwtAuthenticationFilter;
...
✅ 필터는 목(Mock)객체로 만들지 않아도 되는 부분이라고 한다.
💡 요청 처리 흐름
HTTP 요청 → Tomcat → "Filter" → DispatcherServlet → Interceptor → Controller
@Slf4j
@Component
@RequiredArgsConstructor
public class JwtAuthenticationFilter extends OncePerRequestFilter {
// ✅ 의존성 주입이 필요한 부분
private final JwtTokenProvider jwtTokenProvider;
private final BlackListService blackListService;
...
DispatcherServlet
앞단에서 동작한다.JwtFilter
를 거치기 때문에ex. JwtTokenProvider, BlackListService
근데 왜 400대가 안뜨는지는 아직까지도 몰?루...😇
@WebMvcTest(OrderController.class)
@ActiveProfiles("test")
class OrderControllerTest {
@Autowired MockMvc mockMvc;
@MockitoBean OrderService orderService;
// ✅ 필터에게 필요한 의존성 주입
@MockitoBean private JwtTokenProvider jwtTokenProvider;
@MockitoBean private BlackListService blackListService;
...
따라서 필터를 Mock로 만들지 말고, 필터에 의존성인 두개의 서비스를 Mock으로 설정하였다.
야호~!~!~! 🚀🚀🚀🚀
내배캠 튜터님 (샤라웃 팀장님)
테스트 코드 너무 어렵습니다.. (샤라웃 지지합니다)