2012-02-28 15 views
7

Tôi đã viết một lớp biến áp lấy một HttpServletRequest và biến đổi nó thành một kiểu khác có chứa một con trỏ tới InputStream từ yêu cầu servlet. (Ý tưởng là trừu tượng giao thức truyền tải đến từ yêu cầu xử lý, vì vậy tôi cũng có thể viết một biến tương tự từ FTP chẳng hạn.)Kiểm tra đơn vị sử dụng MockMultipartHttpServletRequest (ném NullPointerException trong ItemInputStream.makeAvailable)

Bây giờ tôi đang cố viết một bài kiểm tra đơn vị cho điều này, và tôi ' m gặp vấn đề. Tôi đã tìm ra đúng boilerplate để tạo một yêu cầu Multipart HTTP hợp lệ (sử dụng các lớp Spring MockMultipartHttpServletRequest và MockMultipartFile), nhưng bây giờ tôi nhận được một NullPointerException trong phương thức initialize() của lớp UploadRequest của tôi. Tôi đoán vấn đề là bằng cách nào đó các dòng bên trong MockMultipartHttpServletRequest không được khởi tạo một cách chính xác, nhưng tôi không thể tìm ra những gì tôi nên làm một cách khác nhau.

Bất kỳ đề xuất nào cũng sẽ được chấp nhận một cách biết ơn!

Đây là stack trace:

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) 

Dưới đây là một phiên bản rút gọn của lớp biến áp của tôi:

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

Và đây là bài kiểm tra đơn vị:

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

Trả lời

1

Tôi có cùng vấn đề và tôi googled nhưng không có câu trả lời. Tôi đã cắm mã nguồn từ thư viện, Bạn cần phải gửi nội dung, bất cứ điều gì. Thư viện có thể cần phải kiểm tra xem nó là null trong phương pháp bỏ qua

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

văn vào đây để người khác

1
  1. Thêm điều kiện biên
  2. Tạo nội dung như sau

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

Chức năng mã hóa văn bản

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

Tôi đã trải qua cùng một vấn đề, sau khi tìm kiếm rất nhiều, tôi nhận được bài đăng này, trong đó tôi trả lời bằng mã đã giải quyết được sự cố của tôi.

Giải pháp của Shriprasad hoạt động tốt đối với tệp văn bản. Nhưng tôi đã có một số vấn đề với các tập tin nhị phân.

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