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();
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With