java - 用 mockito 模拟多部分 mime 请求

标签 java web-services junit mockito mime-message

我对 Mockito 和模拟 servlet 进行测试还很陌生。我在模拟 HttpServletRequest 时遇到问题,它将一些表单数据作为 MimeMultiPart 发送到我的 servlet。在我的 servlet 中,我调用 request.getInputStream() 如下:

mimeMultiPart = new MimeMultipart(new ByteArrayDataSource(
                request.getInputStream(), Constants.MULTI_PART_FORM_DATA));

当我模拟我的输入流时,我创建了一个完整的 MimeMultiPart 消息,然后我尝试在下面的代码中从它返回一个 ServletInputStream

    //Helper function to create ServletInputStream
private ServletInputStream createServletInputStream(Object object)
        throws Exception {

    //create output stream
    ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
    ObjectOutputStream outStream = new ObjectOutputStream(byteOut);

    //this part no workey
    outStream.writeObject(object);

    //create input stream
    final InputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());

    //create a new ServletInputStream and return it
    return new ServletInputStream() {

        @Override
        public int read() throws IOException {
            return byteIn.read();
        }
    };
}

@Test
public void testDoPost() throws Exception {
    PrintWriter writer;
    writer = new PrintWriter("testSendMultiPartBatchResponse.txt");
    when(response.getWriter()).thenReturn(writer);

            //this is the mocked request
    when(request.getInputStream()).thenReturn(
            createServletInputStream(multiPartResponse));

. . . 

现在,当我运行此测试时,我在 outStream.writeObject(object) 上收到以下错误:

java.io.NotSerializableException: javax.mail.internet.MimeMultipart
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)

    . . . 

没有必要发布堆栈跟踪的其余部分,我很确定问题是 MimeMultiPart 不可序列化,但我不知道如何纠正这个问题。还有另一种方法来模拟请求吗?我很茫然:(

最佳答案

我认为这应该可行:

final ByteArrayOutputStream os = new ByteArrayOutputStream ();
multiPartResponse.writeTo (os);
final ByteArrayInputStream is = new ByteArrayInputStream (os.toByteArray ());
when(request.getInputStream()).thenReturn(new ServletInputStream() {
        @Override
        public int read() throws IOException {
            return is.read();
        }
    });

关于java - 用 mockito 模拟多部分 mime 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13353545/

相关文章:

wpf - 调用 Web 服务时避免沙漏鼠标光标?

unit-testing - 如何创建 JUnit 4 测试套件以在抛出预期异常时通过

java - hibernate DAO 错误

java - Bluemix Java Liberty Server 应用程序启用应用程序调试灰显

java - 如何在axis生成的客户端中实现线程以使用java向web服务发出多个请求

java - Long[]数组和long[]数组的区别?

java - 第 22 行 : No source code is available for type in html libgdx

java - 尽管通过了测试,但未生成 Pact 文件

java - 如何将 java bean 转换为属性文件?

Java——如何从父类(super class)列表干净地构造子类列表?