加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

如何模拟javax.servlet.ServletInputStream

发布时间:2020-12-14 23:56:16 所属栏目:Java 来源:网络整理
导读:我正在创建一些单元测试并尝试模拟一些调用.这是我在工作代码中的内容: String soapRequest = (SimUtil.readInputStream(request.getInputStream())).toString();if (soapRequest.equals("My String")) { ... } 和SimUtil.readInputSteam看起来像这样: Str
我正在创建一些单元测试并尝试模拟一些调用.这是我在工作代码中的内容:
String soapRequest = (SimUtil.readInputStream(request.getInputStream())).toString();
if (soapRequest.equals("My String")) { ... }

和SimUtil.readInputSteam看起来像这样:

StringBuffer sb = new StringBuffer();
BufferedReader reader = null;
try  {
    reader = new BufferedReader(new InputStreamReader(inputStream));
    final int buffSize = 1024;
    char[] buf = new char[buffSize];
    int numRead = 0;
    while ((numRead = reader.read(buf)) != -1) {
        String readData = String.valueOf(buf,numRead);
        sb.append(readData);
        buf = new char[buffSize];
    }
} catch (IOException e) {
    LOG.error(e.getMessage(),e);
} finally {
    try {
        if (reader != null) {
            reader.close();
        }
    } catch (IOException e) {
        LOG.error(e.getMessage(),e);
    }
}

我想要做的是request.getInputStream(),流返回某些String.

HttpServletRequest request = mock(HttpServletRequest.class);
ServletInputStream inputStream = mock(ServletInputStream.class);
when(request.getInputStream()).thenReturn(inputStream);

所以这是我想要的条件

when(inputStream.read()).thenReturn("My String".toInt());

任何帮助将不胜感激.

解决方法

不要模拟InputStream.而是使用.将String转换为字节数组
getBytes()方法.然后使用数组作为输入创建一个ByteArrayInputStream,以便在消耗时返回String,每次返回每个字节.接下来,创建一个ServletInputStream,它包装一个常规的InputStream,就像Spring中的那样:
public class DelegatingServletInputStream extends ServletInputStream {

    private final InputStream sourceStream;


    /**
     * Create a DelegatingServletInputStream for the given source stream.
     * @param sourceStream the source stream (never <code>null</code>)
     */
    public DelegatingServletInputStream(InputStream sourceStream) {
        Assert.notNull(sourceStream,"Source InputStream must not be null");
        this.sourceStream = sourceStream;
    }

    /**
     * Return the underlying source stream (never <code>null</code>).
     */
    public final InputStream getSourceStream() {
        return this.sourceStream;
    }


    public int read() throws IOException {
        return this.sourceStream.read();
    }

    public void close() throws IOException {
        super.close();
        this.sourceStream.close();
    }

}

最后,HttpServletRequest mock将返回此DelegatingServletInputStream对象.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读