2012-02-28 8 views
7

मैंने एक ट्रांसफॉर्मर क्लास लिखा है जो एक HttpServletRequest लेता है और उसे दूसरे प्रकार में बदल देता है जो सर्वलेट अनुरोध से इनपुटस्ट्रीम में पॉइंटर रखता है। (विचार है कि आने वाले परिवहन प्रोटोकॉल को अनुरोध हैंडलिंग से अमूर्त करना है, इसलिए मैं एफ़टीपी से एक समान ट्रांसफार्मर भी लिख सकता हूं।)MockMultipartHttpServletRequest का उपयोग करके यूनिट परीक्षण (ItemInputStream.makeAlailable में NullPointerException फेंकता है)

अब मैं इसके लिए एक यूनिट टेस्ट लिखने की कोशिश कर रहा हूं, और मैं ' मुझे समस्या है। मैंने एक वैध मल्टीपार्ट HTTP अनुरोध (स्प्रिंग क्लासेस MockMultipartHttpServletRequest और MockMultipartFile का उपयोग करके) बनाने के लिए सही बॉयलरप्लेट को समझने में कामयाब रहा है, लेकिन अब मुझे UploadRequest कक्षा के initialize() विधि में एक NullPointerException मिलता है। मुझे समस्या का अनुमान है कि किसी भी तरह MockMultipartHttpServletRequest के अंदर स्ट्रीम सही ढंग से शुरू नहीं किया जा रहा है, लेकिन मुझे यह नहीं पता कि मुझे अलग-अलग क्या करना चाहिए।

कोई सुझाव आभारी रूप से स्वीकार किया जाएगा! यहाँ

public class UploadRequest { 
    private Map<String, String> params; 
    private InputStream strIn; 
    private Logger Log = Logger.getLogger(UploadRequest.class.getName()); 

    public UploadRequest() 
    { 
    params = new HashMap<String, String>(); 
    } 

    public void initialize(HttpServletRequest sRequest, 
         ServletFileUpload upload) 
    throws IOException, FileUploadException 
    { 
    Enumeration<String> 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; 
     } 
    } 
    } 

और इकाई परीक्षण है::

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

यहाँ मेरी ट्रांसफार्मर वर्ग का एक संक्षिप्त संस्करण है:

यह स्टैक ट्रेस है

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

उत्तर

1

मैं एक ही है मुद्दा और मैं googled लेकिन कोई जवाब नहीं। मैंने पुस्तकालय से स्रोत कोड में प्लग किया है, आपको सामग्री भेजने की ज़रूरत है, जो भी हो। पुस्तकालय की जाँच करने के अगर यह छोड़ विधि में रिक्त है आवश्यकता हो सकती है

MockMultipartHttpServletRequest request 
request.setContent("whatever".getBytes()); 

यहाँ दूसरों के लिए प्रकाशित किया गया था

1
  1. सीमा शर्त जोड़े
  2. रूप

    MockMultipartHttpServletRequest request = 
        this.generateMockMultiPartHttpServletRequest(true); 
    MockMultipartFile mockMultipartFile = null; 
    try { 
        request.setContentType("multipart/form-data; boundary=-----1234"); 
        request.setCharacterEncoding("text/plain"); 
        String endline = "\r\n"; 
        String bondary = "-----1234"; 
        String textFile = this.encodeTextFile("-----1234", "\r\n", "file","test.csv", 
         "text/UTF-8", FileUtils.readFileToString((new File(csvFilePath)), "UTF-8")); 
        StringBuilder content = new StringBuilder(textFile.toString()); 
        content.append(endline); 
        content.append(endline); 
        content.append(endline); 
        content.append("--"); 
        content.append(bondary); 
        content.append("--"); 
        content.append(endline); 
        request.setContent(content.toString().getBytes()); 
        request.setMethod("POST"); 
        mockMultipartFile = new MockMultipartFile("file", 
        FileUtils.readFileToByteArray(new File(csvFilePath))); 
    } catch (Exception e1) { 
        e1.printStackTrace(); 
    } 
    request.addFile(mockMultipartFile); 
    
इस प्रकार उत्पन्न सामग्री

पाठ को एन्कोड करने के लिए फ़ंक्शन

private String encodeTextFile(String bondary, String endline, String name, 
     String filename, String contentType, String content) { 

     final StringBuilder sb = new StringBuilder(64); 
     sb.append(endline); 
     sb.append("--"); 
     sb.append(bondary); 
     sb.append(endline); 
     sb.append("Content-Disposition: form-data; name=\""); 
     sb.append(name); 
     sb.append("\"; filename=\""); 
     sb.append(filename); 
     sb.append("\""); 
     sb.append(endline); 
     sb.append("Content-Type: "); 
     sb.append(contentType); 
     sb.append(endline); 
     sb.append(endline); 
     sb.append(content); 
     return sb.toString(); 
    } 
1

मुझे एक ही समस्या से गुजरने के बाद, मुझे यह पोस्ट मिला, जिसमें मैंने इस पोस्ट को प्राप्त किया जिसमें मैंने अपनी समस्या का समाधान किया।

श्रीप्रसाद का समाधान टेक्स्ट फ़ाइल के लिए अच्छा काम करता है। लेकिन मुझे बाइनरी फाइलों के साथ कुछ समस्याएं थीं।

https://stackoverflow.com/a/30541653/2762092