如何使用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
相关产品推荐
相关产品推荐

