Как протестировать контроллер SpringMvc, который возвращает выгружаемый результат с помощью MockMvc?

Использование весенней загрузки 2.2.4.

У меня есть контроллер SpringMvc, который возвращает выгружаемые объекты:

@RestController
@RequestMapping("/call-data")
public class CallDataController {
  @GetMapping
  public Page<CallDataDto> findAll(Pageable page) {
...

Попытка проверить это с помощью MockMvc:

ObjectMapper mapper = new ObjectMapper();
MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.get("/call-data")).andReturn();
Page<CallDataDto> myDtos = mapper.readValue(mvcResult.getResponse().getContentAsString(), TypeUtils.pageTypeRef());

...

public class TypeUtils {
  public static <T> TypeReference<RestResponsePage<T>> pageTypeRef() {
      return new TypeReference<>() {
};
}

Но вместо страницы с объектами dto я получаю страницу с LinkedHashMaps.

Итак, как получить страницу с объектами dto?


person kostepanych    schedule 04.03.2020    source источник


Ответы (1)


Аналогичный вопрос: ObjectMapper использование TypeReference не работает при передаче типа в универсальном методе

Вы можете решить эту проблему, заменив параметр типа (T) на CallDataDto.

public class TypeUtils {
  public static TypeReference<RestResponsePage<CallDataDto>> pageTypeRef() {
      return new TypeReference<>() {
};
}

Параметры типа (например, <T>) не существуют во время выполнения, поэтому вам нужно заменить их некоторыми конкретными значениями, чтобы Jackson мог получить полную информацию о типе дженериков.

person Tomoki Sato    schedule 04.03.2020