- 24.01.12) TIL2024년 01월 13일 12시 03분 01초에 업로드 된 글입니다.작성자: oneseel
@RequestPart 사용할 때, 컨트롤러 테스트 작성은 어떻게 해야할까?
// 게시글 작성 @PostMapping public ResponseEntity<?> createPost( @RequestPart(value = "requestDto") PostRequestDto requestDto, @RequestPart(value = "file", required = false) MultipartFile file, @RequestParam(required = false) GameType gameType, @RequestParam(required = false) GameName gameName, @RequestParam BoardName boardName, @AuthenticationPrincipal UserDetailsImpl userDetails) throws IOException { postService.createPost(requestDto, gameType, gameName, boardName, file, userDetails); return ResponseEntity.ok(ApiResponse.ok("게시글 작성 성공", null)); }
MockMulitparFile을 이용하여 객체를 만들어준다.
@DisplayName("게시글 컨트롤러 테스트") @WebMvcTest(PostController.class) class PostControllerTest extends ControllerTest implements PostTest { @MockBean private PostService postService; @DisplayName("게시글 생성 - 성공") @Test @WithMockUser(authorities = {"USER"}) void createPostSuccess() throws Exception { // given MockMultipartFile file = new MockMultipartFile( "file", "test-image.jpg", "image/jpeg", "uploadFile".getBytes(StandardCharsets.UTF_8)); PostRequestDto requestDto = TEST_REQUEST_DTO; MockMultipartFile request = new MockMultipartFile( "requestDto", null, "application/json", objectMapper.writeValueAsString(requestDto).getBytes(StandardCharsets.UTF_8)); // when var action = mockMvc.perform(MockMvcRequestBuilders.multipart("/api/posts") .file(file) .file(request) .param("gameType", "PC_GAME") .param("gameName", "VALORANT") .param("boardName", "FREE_BOARD") .contentType(MediaType.MULTIPART_FORM_DATA) .accept(MediaType.APPLICATION_JSON)); // then action.andExpect(MockMvcResultMatchers.status().isOk()).andDo(print());; verify(postService, times(1)).createPost( any(PostRequestDto.class), eq(GameType.PC_GAME), eq(GameName.VALORANT), eq(BoardName.FREE_BOARD), eq(file), any(UserDetailsImpl.class)); }
public class ControllerTest implements UserTest { // 이 컨텍스트는 웹 애플리케이션의 빈들과 설정 정보 등을 관리하는데 사용 @Autowired private WebApplicationContext context; // MockMvc는 웹 애플리케이션을 실제로 실행하지 않고도 컨트롤러를 테스트할 수 있는 도구 @Autowired protected MockMvc mockMvc; // JSON 데이터를 Java 객체로 변환하거나 반대로 변환할 때 사용되는 Jackson 라이브러리의 ObjectMapper를 주입 @Autowired protected ObjectMapper objectMapper; @BeforeEach void setUp() { mockMvc = MockMvcBuilders .webAppContextSetup(context) .build(); // Mock 테스트 UserDetails 생성 UserDetailsImpl testUserDetails = new UserDetailsImpl(TEST_USER); // SecurityContext 에 인증된 사용자 설정 SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken( testUserDetails, testUserDetails.getPassword(), testUserDetails.getAuthorities())); }
<참고>
'TIL' 카테고리의 다른 글
24.01.18) TIL (0) 2024.01.18 24.01.16)TIL (0) 2024.01.16 24.01.11) TIL (0) 2024.01.11 24.01.09) TIL (0) 2024.01.09 24.01.08) TIL (1) 2024.01.08 댓글