Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to send Multipart request with Httpunit in Java

I am essentially asking the exact same question here. As you can see, there are no solid answers. All I want to do is send a file using HTTPUnit to test a java servlet.

So, I have a Java Servlet with this code (dumbed down):

@WebServlet("/properties/StorePropertyAttachment")
@MultipartConfig
public class StorePropertyAttachment {

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

Here is the important part of my test case:

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

When I run this, I get this error:

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)
    ....

Just for kick, if I change line 68 to this (a normal parameter):

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

I get this error (from within my servlet my the way):

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)
....

I don't know why it wont let me add the file.

Any suggestions??

EDIT:

I am trying to submit this using a form from a local html file. I am loading the form in successfully but am getting a 404. Here is my form declaration.

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

Updated test code:

    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();
like image 737
jlars62 Avatar asked Nov 01 '22 22:11

jlars62


1 Answers

Should't the third UploadFileSpec constructor parameter be the content type and not the message type? In your case would be "image/jpeg".

You need a WebForm

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

You really need to dig into the testing framework documentation as suggested in the only answer on your first post.

EDIT: the getPart() method is not supported in the servlet implementation in ServletRunner, that's why you couldn't get any part on the other side and getting an AbtractMethodError.

like image 59
ra2085 Avatar answered Nov 12 '22 14:11

ra2085