如何在Java中使用Httpunit发送多部分请求

5
我是在这里基本上问了完全相同的问题(链接)。正如您所看到的,没有确定的答案。我想做的就是使用HTTPUnit发送文件来测试Java Servlet。
因此,我有一个带有以下代码的Java Servlet(简化版):
@WebServlet("/properties/StorePropertyAttachment")
@MultipartConfig
public class StorePropertyAttachment {

    @Override
    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException{
        final Part p = req.getPart("propertyImage");
         ....
    }
}

这是我的测试用例的重要部分:

    ServletRunner servletRunner = new ServletRunner();
    servletRunner.registerServlet("StorePropertyAttachment", StorePropertyAttachment.class.getName());

    WebRequest webRequest = new PostMethodWebRequest(WEB_REQUEST_BASE_URL + STORE_PROPERTIES_ENDPOINT);
    UploadFileSpec spec = new UploadFileSpec(new File("C:/test.jpg"), "multipart/form-data");
    webRequest.setParameter("propertyImage", new UploadFileSpec[] {spec});
    ^^^^^  line 68  ^^^^^

    ServletUnitClient servletClient = servletRunner.newClient();
    WebResponse webResponse = servletClient.getResponse(webRequest);

当我运行这个程序时,出现了以下错误:
com.meterware.httpunit.IllegalNonFileParameterException: Parameter 'propertyImage' is not a file parameter and may not be set to a file value.
    at com.meterware.httpunit.WebRequest.setParameter(WebRequest.java:232)
    at com.amsgeo.mspworkmanager.services.properties.PropertyAttachmentTest.test(PropertyAttachmentTest.java:68)
    ....

只是为了好玩,如果我把第68行改成这样(一个普通的参数):

webRequest.setParameter("propertyImage", "some string");

我在我的servlet内部遇到了这个错误:

java.lang.AbstractMethodError: com.meterware.servletunit.ServletUnitHttpRequest.getPart(Ljava/lang/String;)Ljavax/servlet/http/Part;
at com.amsgeo.mspworkmanager.services.properties.StorePropertyAttachment.doPost(StorePropertyAttachment.java:40)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at com.amsgeo.webapi.services.ServiceStub.service(ServiceStub.java:64)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at com.meterware.servletunit.InvocationContextImpl.service(InvocationContextImpl.java:76)
at com.meterware.servletunit.ServletUnitClient.newResponse(ServletUnitClient.java:126)
at com.meterware.httpunit.WebClient.createResponse(WebClient.java:647)
at com.meterware.httpunit.WebWindow.getResource(WebWindow.java:220)
at com.meterware.httpunit.WebWindow.getSubframeResponse(WebWindow.java:181)
at com.meterware.httpunit.WebWindow.getResponse(WebWindow.java:158)
at com.meterware.httpunit.WebClient.getResponse(WebClient.java:122)
at com.amsgeo.mspworkmanager.services.properties.PropertyAttachmentTest.testNoParam(PropertyAttachmentTest.java:70)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
....

我不知道为什么它不让我添加文件。

有什么建议吗?

编辑:

我正在尝试使用本地HTML文件中的表单提交此内容。 我已经成功加载了表格,但是出现了404错误。这是我的表单声明:

<form method="POST" action="http://localhost/StorePropertyAttachment" enctype="multipart/form-data" name="propertyImageTest">
    <input type="file" name="propertyImage" />
    <input type="submit" />
</form>

更新的测试代码:

    ServletRunner servletRunner = new ServletRunner();
    servletRunner.registerServlet("StorePropertyAttachment", StorePropertyAttachment.class.getName());

    WebConversation conversation = new WebConversation();
    WebRequest  request = new GetMethodWebRequest("file:/C:/test.html");
    WebResponse response = conversation.getResponse(request);
    WebForm form = response.getFormWithName("propertyImageTest");   
    UploadFileSpec uploadFileSpec = new UploadFileSpec(new File("C:/test.jpg"), "image/jpeg"); 
    form.setParameter("propertyImage", new UploadFileSpec[] {uploadFileSpec});

    WebResponse webResponse = form.submit();

new UploadFileSpec(new File("C:/test.jpg"), "multipart/form-data");。第二个参数值似乎无效。请查看此源代码:链接 - Sowmiya
1个回答

2

第三个UploadFileSpec构造函数的参数应该是内容类型而不是消息类型。在您的情况下,应该是“image/jpeg”。

你需要一个Web表单

WebConversation conversation = new WebConversation();
WebRequest  request = new GetMethodWebRequest("http://your-site-to-test.com/path-to-your-upload-form");
WebResponse response = conversation.getResponse(request);
WebForm form = response.getFormWithName("stockImageUpload");   
UploadFileSpec uploadFileSpec = new UploadFileSpec("test.jpg",new File("C:/test.jpg"), "image/jpeg"); 
form.setParameter("propertyImage", new UploadFileSpec[] {uploadFileSpec});

如第一篇帖子中唯一的回答建议的那样,您真的需要深入了解测试框架文档。

编辑:在 ServletRunner 中不支持 getPart() 方法的 servlet 实现,这就是为什么您无法从另一端获取任何部分并得到 AbtractMethodError 的原因。


如果您不想实现任何HTML资源,那么也许您应该更改Web客户端库。您可以使用普通的HTTPUrlConnections测试上传。 - ra2085
您还可以使用REST客户端库,例如Jersey。 - ra2085
你知道是否有一种方法可以添加本地HTML文件?或者只是在代码中添加静态HTML的方法?如果可能的话,我不想必须发起HTTP请求来获取表单。 - jlars62
我只是用ServletRunner模拟服务器。 - jlars62
1
是的,实际上这就是我想做的,现在我已经搞定了。出于某种原因,只有在文件后面只有一个斜杠时才有效 - 在这里找到了这个提示... http://www.coderanch.com/t/95000/Testing/HttpUnit-Web-Server-howto-newbie。所以现在我有了表单,我成功地设置了参数,但我仍然得到了`404`错误。还不确定为什么。 - jlars62
显示剩余13条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接