Ошибка 406 при имитации REST API загрузки файлов с использованием MockMVC

Я реализую REST API с использованием среды Spring, которая возвращает

return new ResponseEntity<>(new InputStreamResource(myInputStream),
                responseHeaders, HttpStatus.OK);

REST API объявлен как:

@RequestMapping(value = "/download", method = RequestMethod.GET, 
produces = { MediaType.APPLICATION_OCTET_STREAM_VALUE })

При написании модульного теста для этого API я использую MockMVC, как показано ниже:

final MappingJackson2HttpMessageConverter messageConverter = 
new MappingJackson2HttpMessageConverter();
messageConverter.setObjectMapper(new ObjectMapper());
messageConverter.getObjectMapper().enable(SerializationFeature.INDENT_OUTPUT);

this.mockMvc = 
MockMvcBuilders.standaloneSetup(myController)
.setMessageConverters(messageConverter)
.apply(new RestDocumentationConfigurer()
.withScheme("https").withHost("localhost")
.withPort(443)).build();

И мой тестовый пример выглядит так:

mockMvc.perform(
org.springframework.test.web.servlet.request.MockMvcRequestBuilders
.get(restUri))
.andExpect(
org.springframework.test.web.servlet.result.MockMvcResultMatchers
.status().isOk())
.andDo(document("myApi")).andReturn();   

Но я получаю статус ошибки 406.

java.lang.AssertionError: Status expected:<200> but was:<406>
at org.springframework.test.util.AssertionErrors.fail

Что мне здесь не хватает? Любая помощь приветствуется.


person rmagarwal    schedule 22.08.2016    source источник


Ответы (2)


Вы вводите экземпляр MappingJackson2HttpMessageConverter в MockMvcBuilders, который не может справиться с преобразованием классов, наследуемых от Resource. Все, что вам нужно сделать, это добавить ResourceHttpMessageConverter к спецификации теста:

MockMvcBuilders.standaloneSetup(myController)
.setMessageConverters(messageConverter, new ResourceHttpMessageConverter())
person zfChaos    schedule 22.10.2018

Код состояния 406 означает «Неприемлемо», что указывает на то, что на сервере отсутствует заголовок, указывающий принятый тип содержимого. Вам нужно будет включить это в свой вызов mockMvc.

person marthursson    schedule 22.08.2016
comment
Да, я тоже пробовал это как «andExpect(content().contentType(MediaType.APPLICATION_OCTET_STREAM_VALUE))», но затем выдает ошибку, поскольку тип контента не установлен. Я также пытался установить тип контента в заголовке ответа REST API, но это тоже не сработало. - person rmagarwal; 22.08.2016
comment
Это не то, что я сказал. Что вы делаете, так это настраиваете ожидание ответа. Вам нужно настроить предварительное условие для запроса: вызовите accept(MediaType.APPLICATION_OCTET‌​_STREAM) для MockHttpServletRequestBuilder, чтобы был заполнен соответствующий заголовок принятия. - person marthursson; 22.08.2016
comment
Да, тоже пробовал, но все равно выдает ошибку 406. mockMvc.perform(get(restUri).accept(MediaType.APPLICATION_OCTET_STREAM_VALUE)).andExpect(status().isOk()) - person rmagarwal; 24.08.2016