WireMock:如何模拟文件下载过程?

时间:2017-05-22 18:24:48

标签: spring-mvc wiremock

我是WireMock的新人。我正在运行WireMock服务器作为独立进程。我可以通过在/mappings文件夹下配置json文件来模拟简单的rest api。现在,我想模拟一个文件下载终点。我怎么能这样做?

我不知道它是否有帮助,终点是在Java / Spring中,它看起来像这样:

@RequestMapping(value = "xxx/get", method = {RequestMethod.GET})
public ResponseEntity<Object> getFile(HttpServletResponse response) throws Exception {

    final Resource fileResource = fileResourceFactoryBean.getObject();

    if (fileResource.exists()) {
        try (InputStream inputStream = fileResource.getInputStream()) {
            IOUtils.copy(inputStream, response.getOutputStream());

            response.setContentType("application/octet-stream");
            response.setHeader("Content-Disposition", "attachment; filename=" + fileResource.getFilename());

            response.flushBuffer();
            inputStream.close();

            return new ResponseEntity<>(HttpStatus.OK);
        } catch (Exception e) {
            LOGGER.error("Error reading file: ", e);
            return new ResponseEntity<Object>("Error reading file.", HttpStatus.BAD_REQUEST);
        }
    }

    return new ResponseEntity<Object>(fileResource.getFilename() + " not found.", HttpStatus.BAD_REQUEST);
}

映射json文件中的响应部分如下所示:

"response": {
    "status": 200,
    "bodyFileName": "fileName", // file under __files directory
    "headers": {
      "Content-Type": "application/octet-stream"
    }
  }

2 个答案:

答案 0 :(得分:1)

文件下载与发送标记或JSON没什么不同。如果文件不能将MIME类型识别为可以呈现的类型,则Web浏览器会将文件视为下载文件。

要使用WireMock实现此目的,请尝试:

  • 在对application / octet-stream的响应中设置Content-Type标头
  • 设置响应以使用正文文件(您要下载的文件)

答案 1 :(得分:1)

一个很晚的答案,但我找到的唯一可行的解​​决方案是:

"response": {
            "status": 200,
            "headers": {
                "Content-Type": "image/jpeg"
            },
            "base64Body": "2wBDAAQDAwQDAwQE...=="       
        }

我将使用 Base64 编码的图像内容直接放在映射文件中的位置。

或多或少...对于小文件。

在java中,它似乎更方便:

.willReturn( aResponse()
     .withBody( myImage.getBytes() )

使用 json DSL,您只需:

  • bodyFileName(注意:文档说:“正文文件应采用 UTF-8 格式”)
  • base64Body
  • 但是像 base64BodyFileName 这样的东西不可能 :-(