You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Rest-Assured以POJO为请求体编写上传接口测试?

解决Quarkus multipart上传接口的Rest-Assured测试问题

你遇到的核心问题是用Rest-Assured的.body()直接传递包含InputStream的DTO来构造multipart请求的方式不对。multipart/form-data请求需要分部分构造,而不是将整个DTO序列化为请求体——Jackson无法正确序列化InputStream类型为multipart的二进制部分,这就是你看到编码器异常的原因。

解决方案

放弃直接序列化DTO的方式,改用Rest-Assured的multiPart方法手动构建每个表单部分,适配@MultipartForm的接收逻辑:

修改后的测试代码

@SneakyThrows
@Test
void saveExample(){
    String FILE = "src/test/resources/example.zip";
    InputStream fileInputStream = new FileInputStream(FILE);
    String example1Value = "合法的UUID字符串"; // 替换为符合校验的UUID值
    String example2Value = "test@example.com"; // 替换为符合校验的邮箱地址

    ExampleDto actual =
        given()
            // 逐个构造multipart表单部分
            .multiPart("example", "example.zip", fileInputStream, MediaType.APPLICATION_OCTET_STREAM)
            .multiPart("example1", example1Value, MediaType.TEXT_PLAIN)
            .multiPart("example2", example2Value, MediaType.TEXT_PLAIN)
            .accept(MediaType.APPLICATION_JSON) // 接口返回JSON,无需指定multipart类型
            .when()
            .post("/upload")
            .then()
            .statusCode(Response.Status.ACCEPTED.getStatusCode())
            .extract()
            .as(ExampleDto.class);
}

关键修改说明

  • 用multiPart构造请求:
    • 针对example字段(InputStream类型),明确指定表单名、文件名、输入流和对应的APPLICATION_OCTET_STREAM媒体类型,完全匹配DTO上的@FormParam和@PartType注解定义。
    • 文本字段example1、example2直接指定表单名、值和TEXT_PLAIN媒体类型,符合接口接收规则。
  • 移除冗余配置:不需要自定义encoderConfig和ObjectMapper,因为不再依赖Jackson序列化DTO来构造请求,从根源避免了InputStream序列化的问题。
  • 修正accept类型:接口返回APPLICATION_JSON,无需设置为MULTIPART_FORM_DATA。

补充说明

之前用byte[]字段测试可行,是因为Jackson可以将byte[]序列化为二进制数据,但这种方式本质上不符合multipart请求的规范,只是凑巧能被接口解析。而InputStream无法被Jackson序列化,所以必须用标准的multipart请求构造方式。

内容的提问来源于stack exchange,提问作者davids1985

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 13:35:28