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