1

我目前正在嘗試測試一些代碼,我在一個Web應用程序中接受一個HTTP多部分/表單請求,並將其轉換爲稍後可以使用的FileItems列表。這裏是方法:如何模擬與Apache公共的ServletFileUpload兼容的HTTP請求?

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() - 必須有一個更簡單的方法。我試過使用commons-httpclient 3.0來創建一個multipart請求,它的工作原理是成功創建了一個MultipartRequestEntity,但我不確定如何在upload()中使用它,因爲它涉及兩種不同的對象類型。可能嗎?我可以採取哪些步驟來成功模擬請求對象?

回答

1

它看起來像你的問題是ServletFileUpload被構造和在方法內使用的事實,因爲該類是固有的依賴關係,不屬於這個類。我建議超載爲了上傳方法來刪除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)方法的單元測試中使用該模擬。