看了这个主题的一些现有答案,我仍然无法弄清楚我可能做错了什么......
我的单元测试中有以下请求声明:
final MockMultipartHttpServletRequest mockRequest = new MockMultipartHttpServletRequest();
mockRequest.setMethod("POST");
mockRequest.setContentType(contentType);
mockRequest.setRequestURI("/upload");
mockRequest.addParameter("test_param", "test_value");
mockRequest.addFile(new MockMultipartFile("file1", "test_upload1.txt", "text/plain", "fileContent1".getBytes()));
mockRequest.addFile(new MockMultipartFile("file2", "test_upload2.txt", "text/plain", "fileContent2".getBytes()));
mockRequest.setContent("dummyContent".getBytes());
然后我使用另一个类来处理:
public void processServletRequest(final HttpServletRequest request) {
if (ServletFileUpload.isMultipartContent(request)) {
final FileItemFactory factory = new DiskFileItemFactory();
final ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> items = null;
try {
items = upload.parseRequest(request);
} catch (final FileUploadException e) {
this.logger.error("Could not upload document", e);
return;
}
}
}
但upload.parseRequest(request)总是返回一个空列表。
这两个地方之间没有其他地方可以读取请求的输入流(没有调用getParameter()或类似的东西)。
无法查看问题是单元测试和模拟请求,还是处理......任何帮助都将不胜感激。
编辑:好的,手动测试似乎是成功的,这意味着我希望servlet工作正常,问题在于我构建模拟请求的方式 - 但是,将它与我见过的其他示例进行比较在这里和那里,我真的看不出有什么不对。 isMultipartContent()测试成功的事实也告诉我,我没有这样做完全错误......也许我应该使用其他东西建立一个虚拟请求,而不是这个Spring助手类?
EDIT2:好吧,我放弃了,决定手动构建我的请求内容,通过构建StringBuilder添加参数和文件元数据。如果有人能够弄清楚我以前做错了什么,请保持开放,但至少我的测试现在正在运行。
EDIT3:根据评论中的提问,从最近的答案中添加代码段。
public void createMultipartFormDataRequest(MockHttpServletRequest request, String resourceName, String partName) throws IOException {
// Load resource being uploaded
byte[] fileContent = FileCopyUtils.copyToByteArray(getClass().getResourceAsStream(resourceName));
// Create part & entity from resource
Part[] parts = new Part[] { new FilePart(partName, new ByteArrayPartSource(resourceName, fileContent)) };
MultipartRequestEntity multipartRequestEntity = new MultipartRequestEntity(parts, new PostMethod().getParams());
// Serialize request body
ByteArrayOutputStream requestContent = new ByteArrayOutputStream();
multipartRequestEntity.writeRequest(requestContent);
// Set request body to HTTP servlet request
request.setContent(requestContent.toByteArray());
// Set content type to HTTP servlet request (important, includes Mime boundary string)
request.setContentType(multipartRequestEntity.getContentType());
}
答案 0 :(得分:0)