gpt4 book ai didi

java - 使用 MockMultipartHttpServletRequest 进行单元测试(在 ItemInputStream.makeAvailable 中抛出 NullPointerException)

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:33:00 28 4
gpt4 key购买 nike

我编写了一个转换器类,它采用 HttpServletRequest 并将其转换为另一种类型,该类型包含指向来自 servlet 请求的 InputStream 的指针。 (这个想法是从请求处理中抽象传入的传输协议(protocol),因此我也可以从 FTP 编写一个类似的转换器,例如。)

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

我们将不胜感激地接受任何建议!

这是堆栈跟踪:

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)

这是我的转换器类的简化版本:

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

这是单元测试:

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

最佳答案

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

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

为其他人张贴在这里

关于java - 使用 MockMultipartHttpServletRequest 进行单元测试(在 ItemInputStream.makeAvailable 中抛出 NullPointerException),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9474813/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com