如何模拟与apache common的ServletFileUpload兼容的HTTP请求?

时间:2011-07-14 22:02:37

标签: java unit-testing web-applications apache-commons-fileupload

我目前正在尝试测试一些Web应用程序中的代码,该代码接受HTTP多部分/表单请求并将其转换为我稍后可以使用的FileItem列表。这是方法:

private HttpServletRequest request = null;
private List<FileItem> uploadedObjects = null;

/* getter/setter methods */

public void upload() throws FileUploadException {
    ServletFileUpload upload = new ServletFileUpload(
        new DiskFileItemFactory());

    if (request == null) {
        //do nothing - success is already false
    } else if (ServletFileUpload.isMultipartContent(request)) {
        uploadedObjects = upload.parseRequest(request);
        success = true            
    }
}

问题是我在单元测试这个方法时遇到了麻烦。我曾尝试使用EasyMock来模拟HttpServletRequest,但是为了模拟ServletInputStream的read方法,你基本上必须重新实现read() - 必须有一个更简单的方法。

我尝试使用commons-httpclient 3.0创建一个多部分请求,其中我成功创建了一个MultipartRequestEntity,但我不确定如何在upload()中使用它,因为它涉及两种不同的对象类型。可能吗?我可以采取哪些步骤来成功模拟请求对象?

1 个答案:

答案 0 :(得分:1)

看起来你的问题是在方法中构造和使用ServletFileUpload的事实,因为该类是不在此类中的固有依赖。我建议重载upload方法以删除ServletFileUpload依赖项:

public void upload() throws FileUploadException {
  ServletFileUpload servletUpload = new ServletFileUpload(new DiskFileItemFactory());
  upload(servletUpload);
}

public void upload(ServletFileUpload servletUpload) throws FileUploadException{
  if (request == null) {
    //do nothing - success is already false
  } else if (ServletFileUpload.isMultipartContent(request)) {
    uploadedObjects = servletUpload.parseRequest(request);
    success = true            
  }
}

然后,使用EasyMock生成ServletFileUpload的模拟,并调用parseRequest,返回类型为FileItem的列表。在针对上传(ServletFileUpload servletUpload)方法的单元测试中使用该模拟。