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();