I have written (Based on some code Matt Raible posted) some test cases to test my controller. It requires a file tobe uploaded to it. The test case ran ok with Spring 1.2.8 but when I updated to Spring 2 it fails with the following error.
Anyone know what might be going on?
Code:org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is org.apache.commons.fileupload.FileUploadBase$UnknownSizeException: the request was rejected because its size is unknown Caused by: org.apache.commons.fileupload.FileUploadBase$UnknownSizeException: the request was rejected because its size is unknown at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:305) at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:116) at org.springframework.web.multipart.commons.CommonsMultipartResolver.resolveMultipart(CommonsMultipartResolver.java:117) at com.benshort.catalog.web.admin.CategoryFormControllerTests.testCreateWithoutParent(CategoryFormControllerTests.java:163)
The test case
The MockFileItem classCode:byte[] originalImageData = ImageFactory.createJpeg(1524, 2032); MockFileItem fileItem = new MockFileItem("image", "image/jpeg", "test.jpg", new String(originalImageData)); Category categoryThatWillBeSaved = new Category(); categoryThatWillBeSaved.setId(null); categoryThatWillBeSaved.setName("Saved Category"); Image originalImage = new Image(); originalImage.setData(originalImageData); originalImage.setImageType("jpg"); originalImage.setMimeType("image/jpeg"); originalImage.setLength(originalImage.getData().length); originalImage.setLastModified(new Date().getTime()); Image imageThatWillBeSaved = new Image(); imageThatWillBeSaved.setData(ImageUtils.resize(150, 200, originalImageData, "jpg")); imageThatWillBeSaved.setImageType("jpg"); imageThatWillBeSaved.setMimeType("image/jpeg"); imageThatWillBeSaved.setLength(imageThatWillBeSaved.getData().length); imageThatWillBeSaved.setLastModified(originalImage.getLastModified()); categoryThatWillBeSaved.setImage(imageThatWillBeSaved); categoryThatWillBeSaved.setImageName("null.jpg"); // called by onSubmit() mMockCatalogRepository.expects(once()).method("saveCategory").with(eq(categoryThatWillBeSaved)); mMockImageRepository.expects(once()).method("saveImage").with(eq(imageThatWillBeSaved)); MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("POST", "/createCategory.html"); httpServletRequest.setContentType("multipart/form-data"); httpServletRequest.addHeader("Content-type", "multipart/form-data"); httpServletRequest.addParameter("name", categoryThatWillBeSaved.getName() ); httpServletRequest.addParameter("parent", "-1"); List<MockFileItem> fileItems = new ArrayList<MockFileItem>(); fileItems.add(fileItem); MockCommonsMultipartResolver resolver = new MockCommonsMultipartResolver(fileItems); assertTrue(resolver.isMultipart(httpServletRequest)); MultipartHttpServletRequest multipartRequest = resolver.resolveMultipart(httpServletRequest); mMockHttpImageUtil.expects(once()).method("validateAndCreateImage").with(eq("image"), eq(multipartRequest), isA(BindException.class) , eq(true)).will(returnValue(originalImage)); mModelAndView = mController.handleRequest(multipartRequest, new MockHttpServletResponse()); // verify expectations mMockCatalogRepository.verify(); mMockImageRepository.verify();
The MockCommonsMultipartResolver classCode:public class MockFileItem implements FileItem { private String fieldName; private String contentType; private String name; private String value; private File writtenFile; private boolean deleted; public MockFileItem(String fieldName, String contentType, String name, String value) { this.fieldName = fieldName; this.contentType = contentType; this.name = name; this.value = value; } public InputStream getInputStream() throws IOException { return new ByteArrayInputStream(value.getBytes()); } public String getContentType() { return contentType; } public String getName() { return name; } public boolean isInMemory() { return true; } public long getSize() { return value.length(); } public byte[] get() { return value.getBytes(); } public String getString(String encoding) throws UnsupportedEncodingException { return new String(get(), encoding); } public String getString() { return value; } public void write(File file) throws Exception { this.writtenFile = file; } public File getWrittenFile() { return writtenFile; } public void delete() { this.deleted = true; } public boolean isDeleted() { return deleted; } public String getFieldName() { return fieldName; } public void setFieldName(String s) { this.fieldName = s; } public boolean isFormField() { return (this.name == null); } public void setFormField(boolean b) { throw new UnsupportedOperationException(); } public OutputStream getOutputStream() throws IOException { throw new UnsupportedOperationException(); } }
Code:public class MockCommonsMultipartResolver extends CommonsMultipartResolver { private boolean empty; private List<MockFileItem> mFileItem; private MockFileItem mEmptyFileITem = new MockFileItem("file", "text/html", empty ? "" : "test.xml", empty ? "" : "<root/>"); public MockCommonsMultipartResolver(List<MockFileItem> fileItem) { mFileItem = fileItem; } public void setEmpty(boolean empty) { this.empty = empty; } protected DiskFileUpload newFileUpload() { return new DiskFileUpload() { public List parseRequest(HttpServletRequest request) { if (request instanceof MultipartHttpServletRequest) { throw new IllegalStateException("Already a multipart request"); } List fileItems = new ArrayList(); if ( empty ) fileItems.add(mEmptyFileITem); else fileItems.addAll(mFileItem); return fileItems; } }; } }


Reply With Quote