模拟使用MockMVC下载REST API时出现406错误

时间:2016-08-22 10:28:03

标签: spring rest unit-testing spring-mvc mockmvc

我正在使用Spring框架实现REST API,它返回

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

我在这里缺少什么? 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

您将MappingJackson2HttpMessageConverter的实例注入到MockMvcBuilders中,该实例无法处理从Resource继承的类的转换。您需要做的就是将ResourceHttpMessageConverter添加到您的测试规范中:

MockMvcBuilders.standaloneSetup(myController)
.setMessageConverters(messageConverter, new ResourceHttpMessageConverter())

答案 1 :(得分:0)

状态代码406表示“不可接受”,表示服务器缺少指定接受内容类型的标头。您需要在mockMvc调用中包含它。