Wiremock:如何模拟返回InputStream的端点



我有一个工作代码,它请求一个端点并以这种方式读取其响应(流是PDF(:

private Response readResponseBody(Response response) throws IOException {
InputStream inputStream = response.readEntity(InputStream.class);
try (ByteArrayOutputStream os = new ByteArrayOutputStream()) {
if (inputStream != null) {
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) != -1) { //error this line with wiremock
os.write(buffer, 0, len);
}
}
}
//other stuffs...
}

我试着在使用JUnit4@Rule的测试环境中使用wiremock来模拟这个enpoint,这样:

byte[] pdfFile = Files.readAllBytes(Paths.get(ClassLoader.getSystemResource("file.pdf").toURI()));
stubFor(
get(urlPathMatching(mockPath))
.withHeader("Authorization", equalTo(mockedToken))
.willReturn(aResponse()
.withStatus(200)
.withBody(pdfFile)));

但是当我请求模拟端点时,我无法读取InputStream,我在上面提到的行中得到了这个错误:

org.apache.http.ConnectionClosedException: Premature end of chunk coded message body: closing chunk expected

使用Wiremock模拟返回InputStream的端点的正确方法是什么?

花了一些时间阅读Wiremock文档后,我发现了问题所在。创建下载某个文件的存根的一种方法是将该文件放在src/test/resources/__files目录下,如果我要使用以下方法:

withBodyFile("file.pdf")

默认情况下,这是Wiremock服务器通过存根获取任何要下载的文件的目录。这解决了我的问题。

基于这个响应,我猜您可以只返回文件路径作为响应主体。

.willReturn(aResponse()
.withStatus(200)
.withBodyFile("/path/to/pdf/file")));

如果这不起作用,我建议在响应中添加一个内容类型标头。假设文件是pdf,那就是

.withHeader("Content-Type", "application/pdf")

相关内容

  • 没有找到相关文章

最新更新