Java 使用MockMultipartTTPServletRequest进行单元测试(在ItemInputStream.makeAvailable中抛出NullPointerException)

Java 使用MockMultipartTTPServletRequest进行单元测试(在ItemInputStream.makeAvailable中抛出NullPointerException),java,spring,unit-testing,junit,jmock,Java,Spring,Unit Testing,Junit,Jmock,我已经编写了一个transformer类,它接受一个HttpServletRequest并将其转换为另一个类型,该类型保存一个指向servlet请求的InputStream的指针。(想法是从请求处理中抽象出传入的传输协议,因此我也可以从FTP中编写类似的转换器。) 现在我正试图为此编写一个单元测试,但我遇到了一些问题。我已经设法找到了正确的样板文件来创建一个有效的多部分HTTP请求(使用Spring类MockMultipartTTpServletRequest和MockMultipartFile

我已经编写了一个transformer类,它接受一个HttpServletRequest并将其转换为另一个类型,该类型保存一个指向servlet请求的InputStream的指针。(想法是从请求处理中抽象出传入的传输协议,因此我也可以从FTP中编写类似的转换器。)

现在我正试图为此编写一个单元测试,但我遇到了一些问题。我已经设法找到了正确的样板文件来创建一个有效的多部分HTTP请求(使用Spring类MockMultipartTTpServletRequest和MockMultipartFile),但是现在我在我的
UploadRequest
类的
initialize()
方法中得到了一个NullPointerException。我猜问题在于mockmultipartttpServletRequest中的流没有被正确初始化,但是我不知道应该做什么不同

任何建议都将被感激地接受

这是堆栈跟踪:

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)

我也有同样的问题,我在谷歌上搜索过,但没有答案。我从库中插入源代码,你需要发送内容,无论什么。库可能需要在skip方法中检查它是否为null

MockMultipartHttpServletRequest request
request.setContent("whatever".getBytes());
为其他人张贴在这里

  • 添加边界条件
  • 生成如下内容

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

    我也遇到了同样的问题,在搜索了很多之后,我得到了这篇文章,在其中我用解决我问题的代码进行了回答

    Shriprasad的解决方案适用于文本文件。但是我有一些二进制文件的问题

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