title: Unit testing using MockMultipartHttpServletRequest (throws NullPointerException in ItemInputStream.makeAvailable)
body: <p>I've written a transformer class that takes an HttpServletRequest and transforms it into another type that holds a pointer to the InputStream from the servlet request. (The idea is to abstract the incoming transport protocol from the request handling, so I could also write a similar transformer from FTP, for instance.)</p>
  
  <p>Now I'm trying to write a unit test for this, and I'm having problems. I've managed to figure out the correct boilerplate to create a valid Multipart HTTP request (using the Spring classes MockMultipartHttpServletRequest and MockMultipartFile), but now I get a NullPointerException in the <code>initialize()</code> method of my <code>UploadRequest</code> class. I'm guessing the problem is that somehow the stream inside the MockMultipartHttpServletRequest isn't being initialized correctly, but I can't figure out what I should do differently.</p>
  
  <p>Any suggestions would be gratefully accepted!</p>
  
  <p>This is the stack trace:</p>
  
  <pre><code>java.lang.NullPointerException
      at org.apache.commons.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:976)
      at org.apache.commons.fileupload.MultipartStream$ItemInputStream.read(MultipartStream.java:886)
      at java.io.InputStream.read(InputStream.java:82)
      at org.apache.commons.fileupload.util.Streams.copy(Streams.java:96)
      at org.apache.commons.fileupload.util.Streams.copy(Streams.java:66)
      at org.apache.commons.fileupload.MultipartStream.readBodyData(MultipartStream.java:592)
      at org.apache.commons.fileupload.MultipartStream.discardBodyData(MultipartStream.java:618)
      at org.apache.commons.fileupload.MultipartStream.skipPreamble(MultipartStream.java:637)
      at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.findNextItem(FileUploadBase.java:984)
      at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.&lt;init&gt;(FileUploadBase.java:965)
      at org.apache.commons.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:331)
      at org.apache.commons.fileupload.servlet.ServletFileUpload.getItemIterator(ServletFileUpload.java:148)
      at com.ooyala.UploadRequest.initialize(UploadRequest.java:51)
      at com.ooyala.UploadRequestTest.testCreateFromServletRequest(UploadRequestTest.java:57)
  </code></pre>
  
  <p>Here's an abbreviated version of my transformer class:</p>
  
  <pre><code>public class UploadRequest {
    private Map&lt;String, String&gt; params;
    private InputStream strIn;
    private Logger Log = Logger.getLogger(UploadRequest.class.getName());
  
    public UploadRequest()
    {
      params = new HashMap&lt;String, String&gt;();
    }
  
    public void initialize(HttpServletRequest sRequest, 
                           ServletFileUpload upload)
      throws IOException, FileUploadException
    {
      Enumeration&lt;String&gt; paramNames = sRequest.getParameterNames();
      while (paramNames.hasMoreElements()) {
        String pName = paramNames.nextElement();
        params.put(pName, sRequest.getParameter(pName));
      }
      params.put("request_uri", sRequest.getRequestURI());
  
      FileItemIterator iter = upload.getItemIterator(sRequest);
      while (iter.hasNext()) {
        FileItemStream item = iter.next();
        try {
          if (!item.isFormField()) {
            // Skip form fields
            params.put("original_file_name", item.getName());
            strIn = item.openStream();
          } 
        } catch (IOException ex) {
          Log.severe("File uploading exception: " + ex.getMessage());
          throw ex;
        }
      }
    }
  </code></pre>
  
  <p>And here's the unit test:</p>
  
  <pre><code>import org.springframework.mock.web.MockMultipartHttpServletRequest;
  import org.springframework.mock.web.MockMultipartFile;
  import org.apache.commons.fileupload.servlet.ServletFileUpload;
  // etc.... other imports
  
  @RunWith(JMock.class)
  public class UploadRequestTest {
    private UploadRequest upRequest;
  
    @Before
      public void setUp()
      {
        context.setImposteriser(ClassImposteriser.INSTANCE);
        upRequest = new UploadRequest();
      }
  
    @Test
      public void testCreateFromServletRequest()
        throws IOException, FileUploadException
      {
        String text_contents = "hello world";
  
        MockMultipartHttpServletRequest sRequest = 
          new MockMultipartHttpServletRequest();
        sRequest.setMethod("POST");
        String boundary = generateBoundary();
        String contentType = "multipart/form-data; boundary="+boundary;
        sRequest.setContentType(contentType);
        sRequest.setRequestURI("/foo");
        sRequest.addParameter("test_param","test_value");
        sRequest.addFile(
          new MockMultipartFile("file1","test_upload.txt","text/plain",
            text_contents.getBytes()));
  
        ServletFileUpload upload = new ServletFileUpload();
        assertTrue(upload.isMultipartContent(sRequest));
  
        upRequest.initialize(sRequest, upload);
      }
  }
  </code></pre>