javaunit-testinghttpservletsspring-test

How to use spring's MockMultipartHttpServletRequest? Getting "no multipart boundary was found"


Clearly I'm not using this test fixture right. My servlet works just fine in tomcat, but when I try to use this mock, the multi-part boundary is not found. "the request was rejected because no multipart boundary was found".

There is an answer here that shows how to use this using a text file, but that answer sets the boundary string explicitly and embeds the file as test. I would think I would not need to do with by hand with methods like mockrequest.addFile(...)

What am I not setting here or how I am doing this wrong?

@org.testng.annotations.Test
public void testDoPost() throws Exception
{
    MockMultipartFile file = new MockMultipartFile("test.zip", "test.zip", "application/zip", MyServletTest.class.getResourceAsStream("/test.zip"));
    MockMultipartHttpServletRequest mockRequest = new MockMultipartHttpServletRequest();
    mockRequest.addFile(file);
    mockRequest.set
    mockRequest.setMethod("POST");
    mockRequest.setParameter("variant", "php");
    mockRequest.setParameter("os", "mac");
    mockRequest.setParameter("version", "3.4");
    MockHttpServletResponse response = new MockHttpServletResponse();
    new MyServletTest().doPost(mockRequest, response);
    //  BOOM !
}

Here is the exception

Caused by: blablah:   the request was rejected because no multipart boundary was found

Solution

  • You need to set the boundary.

    Here there is a good explanations about what is the boundary https://stackoverflow.com/a/10932533/2762092

    To solve your problem try this code.

        import java.io.IOException;
        import java.nio.file.Files;
        import java.nio.file.Path;
        import java.nio.file.Paths;
    
        import org.apache.commons.lang.ArrayUtils;
        import org.springframework.mock.web.MockHttpServletResponse;
        import org.springframework.mock.web.MockMultipartFile;
        import org.springframework.mock.web.MockMultipartHttpServletRequest;
    
    
    public class FileUploadTest {
    
        public void testDoPost() throws IOException {
                Path path = Paths.get("c:\\temp\\test.zip");
                byte[] data = Files.readAllBytes(path);
                MockMultipartFile file = new MockMultipartFile("test.zip", "test.zip",
                        "application/zip", data);
                MockMultipartHttpServletRequest mockRequest = new MockMultipartHttpServletRequest();
                String boundary = "q1w2e3r4t5y6u7i8o9";
                mockRequest.setContentType("multipart/form-data; boundary="+boundary);
                mockRequest.setContent(createFileContent(data,boundary,"application/zip","test.zip"));
                mockRequest.addFile(file);
                mockRequest.setMethod("POST");
                mockRequest.setParameter("variant", "php");
                mockRequest.setParameter("os", "mac");
                mockRequest.setParameter("version", "3.4");
                MockHttpServletResponse response = new MockHttpServletResponse();
                new FileUpload().doPost(mockRequest, response);
            }
    
            public byte[] createFileContent(byte[] data, String boundary, String contentType, String fileName){
                String start = "--" + boundary + "\r\n Content-Disposition: form-data; name=\"file\"; filename=\""+fileName+"\"\r\n"
                         + "Content-type: "+contentType+"\r\n\r\n";;
    
                String end = "\r\n--" + boundary + "--"; // correction suggested @butfly 
                return ArrayUtils.addAll(start.getBytes(),ArrayUtils.addAll(data,end.getBytes()));
            }
    }