Contoller Test : Pageable 관련 에러

twonezero·2024년 9월 9일
0
post-custom-banner

Test 중 pageable 관련 문제

Springboot API 를 개발하고 컨트롤러 테스트를 작성하던 중 발생하는 에러..

전체 조회 테스트에 Pageable 객체가 모킹돼있어서 그런 것 같았다. 아래는 테스트 코드는 전체 조회(검색)을 하는 코드이다. Response 로 가는 객체의 필드 존재 여부를 확인하고 Mockito 를 활용해 모킹한 dto 의 필드를 비교한다.

@Test
    public void getAllProducts_searchByName_returnsProductResponses() throws Exception {
        ProductSearchType searchType = ProductSearchType.NAME;
        String searchValue = "Test"; // -> Test Product

        List<ProductDto> productDtos = List.of(productDto);
        Page<ProductDto> productDtoPage = new PageImpl<>(productDtos,Pageable.ofSize(10), productDtos.size());

        when(productService.getAllProducts(eq(null),eq(null), eq(searchType), eq(searchValue), any(Pageable.class)))
                .thenReturn(productDtoPage);

        mockMvc.perform(get("/api/products")
                        .param("searchType", searchType.name())
                        .param("searchValue", searchValue)
                        .param("page", "0")
                        .param("size", "10")
                        .contentType(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andDo(print())
                .andExpect(jsonPath("$.data.content[0].id").value(productDto.id().toString()))
                .andExpect(jsonPath("$.data.content[0].company.id").value(productDto.companyId().toString()))
                .andExpect(jsonPath("$.data.content[0].company.name").value(productDto.companyName()))
                .andExpect(jsonPath("$.data.content[0].name").value(productDto.name()))
                .andExpect(jsonPath("$.data.content[0].quantity").value(productDto.quantity()))
                .andExpect(jsonPath("$.data.content[0].createdAt").exists())
                .andExpect(jsonPath("$.data.totalElements").value(productDtos.size()))
                .andExpect(jsonPath("$.data.totalPages").value(1));
    }

해결

에러 내용에 대해 구글링으로 찾아보니 mockMvc를 사용하는 설정에서 Pageable 객체 인자를 다룰 수 있는 Resolver 를 설정해야 한다.

public void setup() {
        mockMvc = MockMvcBuilders.standaloneSetup(productController)
                .setCustomArgumentResolvers(new PageableHandlerMethodArgumentResolver()) // Pageable 처리
                .build();
profile
소소한 행복을 즐기는 백엔드 개발자입니다😉
post-custom-banner

0개의 댓글