Как установить тип содержимого для теста с пружинной загрузкой, который возвращает файл PDF - PullRequest
0 голосов
/ 10 января 2019

В настоящее время я тестирую один из моих сервисов с помощью Spring boot test. Сервис экспортирует все пользовательские данные и выдает CSV или PDF после успешного завершения. Файл загружается в браузер.

Ниже приведен код, который я написал в своем тестовом классе

MvcResult result =   MockMvc.perform(post("/api/user-accounts/export").param("query","id=='123'")
    .contentType(MediaType.APPLICATION_JSON_VALUE)
    .accept(MediaType.APPLICATION_PDF_VALUE)
    .content(TestUtil.convertObjectToJsonBytes(userObjectDTO)))
    .andExpect(status().isOk())
    .andExpect(content().contentType(MediaType.APPLICATION_PDF_VALUE))
    .andReturn();
String content = result.getResponse().getContentAsString();  // verify the response string.

Ниже приведен мой код класса ресурса (звонок приходит на это место) -

    @PostMapping("/user-accounts/export")
@Timed
public ResponseEntity<byte[]> exportAllUsers(@RequestParam Optional<String> query, @ApiParam Pageable pageable, 
@RequestBody UserObjectDTO userObjectDTO) {
HttpHeaders headers = new HttpHeaders();
.
.
.

 return new ResponseEntity<>(outputContents, headers, HttpStatus.OK);

 }

Пока я отлаживаю свой сервис и помещаю отладку непосредственно перед выходом, я получаю Тип контента как 'application / pdf' и статус 200. Я попытался повторить тот же тип контента в моем тестовом примере. Каким-то образом это всегда выдает ошибку ниже во время выполнения -

   java.lang.AssertionError: Status 
   Expected :200
   Actual   :406

Я хотел бы знать, как мне проверить мой ответ (ResponseEntity). Также какой должен быть тип контента для ответа.

Ответы [ 3 ]

0 голосов
/ 15 января 2019

У вас есть проблемы где-то еще. Похоже, что произошла исключительная ситуация / ошибка, как отмечено типом содержимого application / problem + json. Это, вероятно, установлено в обработчике исключений. Поскольку ваш клиент только ожидает приложения / PDF 406 возвращается.

Вы можете добавить контрольный пример, чтобы прочитать подробности об ошибке, чтобы узнать, что именно это за ошибка.

Что-то вроде

MvcResult result = MockMvc.perform(post("/api/user-accounts/export").param("query","id=='123'")
    .contentType(MediaType.APPLICATION_JSON_VALUE)
    .accept(MediaType.APPLICATION_PROBLEM_JSON_VALUE)
    .content(TestUtil.convertObjectToJsonBytes(userObjectDTO)))
    .andExpect(status().isOk())
    .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON_VALUE))
    .andReturn();
String content = result.getResponse().getContentAsString();  // This should show you what the error is and you can adjust your code accordingly. 

Если вы ожидаете ошибку, вы можете изменить тип подтверждения, включив в него как pdf, так и проблемный тип json.

Примечание. Это поведение зависит от имеющейся у вас версии Spring Web MVC.

Последняя весенняя версия mvc учитывает заголовок типа контента, установленный в объекте ответа, и игнорирует то, что предусмотрено в заголовке accept, и анализирует возможный формат ответа. Таким образом, тот же тест, который у вас есть, не вернет код 406, а вернет контент с типом контента задачи json приложения.

0 голосов
/ 17 января 2019

Я нашел ответ с помощью @veeram и понял, что моя конфигурация для MappingJackson2HttpMessageConverter не соответствовала моему требованию. Я переопределяю его значение по умолчанию, поддерживаемое Mediatype, и оно решило проблему.

Поддерживается по умолчанию -

implication/json
application*/json

Изменение кода сделано, чтобы исправить это дело -

@Autowired
private MappingJackson2HttpMessageConverter jacksonMessageConverter;

List<MediaType> mediaTypes = new ArrayList<>();
mediaTypes.add(MediaType.ALL);
jacksonMessageConverter.setSupportedMediaTypes(mediaTypes);
0 голосов
/ 14 января 2019

406 означает, что ваш клиент запрашивает contentType (возможно, pdf), который сервер не может предоставить.

Я предполагаю, что причина того, что ваш код работает, когда вы отлаживаете, заключается в том, что ваш остальной клиент не добавляет заголовок ACCEPT, который запрашивает pdf, как тестовый код.

Чтобы решить эту проблему, добавьте к аннотации @PostMapping produces = MediaType.APPLICATION_PDF_VALUE см. https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/annotation/PostMapping.html#produces--

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...