【发布时间】:2017-09-09 16:04:18
【问题描述】:
我知道类似的问题已经出现过几次了,但是按照建议的修复方法并没有解决我的问题。
我有一个带有以下端点的简单控制器:
@RequestMapping(method = RequestMethod.POST)
public ResponseEntity<String> singleFileUpload(@RequestParam("file") MultipartFile file) {
log.debug("Upload controller - POST: {}", file.getOriginalFilename());
// do something
}
我正在尝试使用 Spring TestRestTemplate 为其编写集成测试,但我所有的尝试都以 400 - Bad Request 结尾(没有日志说明控制台中出了什么问题)。
控制器内部的日志没有被命中,所以在到达那里之前就失败了。
您能否看看我的测试并指出我做错了什么?
@Test
public void testUpload() {
// simulate multipartfile upload
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("image.jpg").getFile());
MultiValueMap<String, Object> parameters = new LinkedMultiValueMap<String, Object>();
parameters.add("file", file);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<MultiValueMap<String, Object>>(parameters, headers);
ResponseEntity<String> response = testRestTemplate.exchange(UPLOAD, HttpMethod.POST, entity, String.class, "");
// Expect Ok
assertThat(response.getStatusCode(), is(HttpStatus.OK));
}
【问题讨论】:
-
看起来您在测试中设置了 ContentType = MULTIPART_FORM_DATA。但是您的控制器未设置为接收此类请求。尝试使用 consumes = {MediaType.MULTIPART_FORM_DATA_VALUE} 请发布测试类的其余部分,因为有一些我无法在此处重现的缺失部分
-
@BrunoLeite 谢谢你的建议。我试过了,但事实并非如此。
-
你真的用你的响应实体返回一个字符串吗?您是否验证了 400 响应正文中的内容,以防它提供更多详细信息?您是否考虑过使用调试器运行它或实现异常处理程序?
-
是的,正在返回字符串。它在集成测试之外工作正常。在这个测试中,我发布了。我什至没有得到调试线,所以在它到达控制器主体之前发生了一些事情。
标签: java spring spring-boot junit resttemplate