当前位置: 首页 > 面试题库 >

使用MockMultipartHttpServletRequest进行单元测试(在ItemInputStream.makeAvailable中引发NullPointerException)

西门梓
2023-03-14
问题内容

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

现在,我正在尝试为此编写单元测试,但遇到了问题。我设法找出正确的样板来创建一个有效的Multipart HTTP请求(使用Spring类MockMultipartHttpServletRequestMockMultipartFile),但是现在我在类的initialize()方法中得到了NullPointerException UploadRequest。我猜的问题是,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());

为其他人张贴在这里



 类似资料:
  • 问题内容: 我选择的数据库是MongoDB。我正在编写一个数据层API,以从客户端应用程序中抽象实现细节- 也就是说,我实质上是在提供一个公共接口(一个充当IDL的对象)。 我正在以TDD方式测试自己的逻辑。在每个单元测试之前,调用一个方法来创建数据库单例,此后,当测试完成时,将调用一个方法来删除数据库。这有助于促进单元测试之间的独立性。 几乎所有单元测试(即 执行上下文查询 )都需要先进行某种插

  • 我想测试以下骆驼路线。我在网上找到的所有例子都有以文件开头的路由,在我的例子中,我有一个Springbean方法,每隔几分钟就会被调用一次,最后消息被转换并移动到jms以及审计目录。 我对这条路线的写测试毫无头绪。目前我在测试用例中所拥有的是

  • 我正在构建一个android应用程序,它使用Firebase作为后端,并采用模型、视图和演示者架构。然而,Firebase是一种云服务的事实使我的android应用程序中的自动测试变得复杂。到目前为止,我已经构建了大部分身份验证系统,但无法看到如何在我的应用程序中实现Firebase代码的单元测试。在端到端测试方面,我也陷入了困境。 由于测试是任何android应用程序的基础,没有it应用程序开发

  • 问题内容: 我的公司一直在评估Spring MVC,以确定我们是否应该在下一个项目中使用它。到目前为止,我喜欢我所看到的内容,现在,我正在查看Spring Security模块,以确定是否可以/应该使用它。 我们的安全要求非常基本。用户只需要能够提供用户名和密码即可访问网站的某些部分(例如获取有关其帐户的信息);并且网站上的页面很少(常见问题解答,支持等),应该为匿名用户提供访问权限。 在我创建的

  • 使用Android Studio进行单元测试 原文链接 : Unit Testing With Android Studio 原文作者 : Rex St John 译文出自 : 开发技术前线 www.devtf.cn 译者 : ZhaoKaiQiang 校对者: zhengxiaopeng 状态 : 校对完 这篇文章介绍了在Android Studio中进行单元测试的基础部分。 很多教程都指导你应

  • 我想测试我的SpringBoot应用程序,它使用cassandra作为CrudRepository。我最终得到了 具有 和 这就导致了 如果我使用旧版本的cassandra-unit-Spring 它以NullPointerException结束,因为没有注入值repo。 来源https://github.com/StephanPraetsch/spring.boot.cassandra.unit