【问题标题】:ServletFileUpload.parseRequest() returning an empty list for MockMultipartHttpServletRequestServletFileUpload.parseRequest() 为 MockMultipartHttpServletRequest 返回一个空列表
【发布时间】:2013-06-26 16:00:47
【问题描述】:

查看了该主题的一些现有答案,我仍然无法弄清楚我可能做错了什么......

我的单元测试中有以下请求声明:

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:根据评论中的要求,从最近的答案中添加代码 sn-p。

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());
}

【问题讨论】:

    标签: java unit-testing file-upload mocking


    【解决方案1】:

    【讨论】:

    • 您认为您可以将相关详细信息编辑到您的答案中,而不仅仅是提供链接吗?如果该博客被删除,此答案将不再有用。
    • 我在原来的帖子中已经这样做了 - 无法编辑 Srinivas 的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-05
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多