java 如何正确编写请求体为Rest-Assured POJO的测试?请使用编码器配置(编码器配置#encodeContentTypeAs)

lnvxswe2  于 2022-12-21  发布在  Java
关注(0)|答案(1)|浏览(134)

我在为POST/uplaod端点编写Rest-Assured测试时遇到问题。然后运行此端点的Quarkus应用程序按预期工作,文件成功上传并保存到DB。但我不知道如何测试此端点。我尝试了几种方法,但它们不起作用。
最新的例外之一是:Please use EncoderConfig (EncoderConfig#encodeContentTypeAs) to specify how to serialize data for this content-type.
也有例外:No serializer found for class java.io.FileDescriptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS),但这一个固定与放心配置。
我无法更改DTO Example类的字段类型。使用byte []可以,使用InputStream不可以。
DTO类:

@Builder
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Data
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
public class ExampleDto {
  @FormParam("example")
  @PartType(MediaType.APPLICATION_OCTET_STREAM)
  private InputStream example;

  @FormParam("example1")
  @PartType(MediaType.TEXT_PLAIN)
  @UUID
  private String example1 ;

  @Email
  @FormParam("example2")
  @PartType(MediaType.TEXT_PLAIN)
  private String example2;
}

资源类发布方法:

@POST
  @Path("/upload")
  @Consumes(MULTIPART_FORM_DATA)
  @Produces(APPLICATION_JSON)
  public Response saveExample(@MultipartForm @Valid ExampleDto example) {
    ExampleDto exampleDto = serviceExample.save(example);
    return Response.accepted().entity(exampleDto).build();
  }

REST-保证测试:

@SneakyThrows
  @Test
  void saveExample(){
    String FILE = "src/test/resources/example.zip";
    InputStream file = new FileInputStream(FILE);
    ExampleDto example = new ExampleDto(file, "example1", "example2");

    ExampleDto actual =
        given()
            .config(
                RestAssured.config()
                    .encoderConfig(
                        encoderConfig()
                            .encodeContentTypeAs("multipart/form-data", ContentType.MULTIPART))
                    .objectMapperConfig(
                        new ObjectMapperConfig()
                            .jackson2ObjectMapperFactory(
                                (cls, charset) -> {
                                  ObjectMapper om = new ObjectMapper();
                                  om.configure(
                                      SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true);
                                  om.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
                                  om.configure(
                                      DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
                                  return om;
                                })))
            .body(example)
            .when()
            .accept(MediaType.MULTIPART_FORM_DATA)
            .post("/upload")
            .then()
            .statusCode(Response.Status.ACCEPTED.getStatusCode())
            .extract()
            .as(ExampleDto.class);
  }

谢谢你提前给我出主意。

jogvjijk

jogvjijk1#

你可以这样尝试:

private RequestSpecification baseRequest(){
        return given()
                .baseUri(BASE_URI)
                .basePath(basePath)
                .relaxedHTTPSValidation();}
baseRequest()
                .contentType(ContentType.MULTIPART)
                .formParams(formParams)
                .multiPart("content", file)
                .post(endpointURL);

相关问题