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