提问者:小点点

如何正确编写以POJO作为请求体的测试?例外:请使用EncoderConfig(EncoderConfig#CodeContentTypeAs)


我有问题写的Rest保证测试POST/uplodendpoint。然后QUKUS应用程序运行此endpoint按预期工作,文件成功上传并保存到DB。但我不知道如何测试此endpoint。我尝试了几件事,但它们不起作用。

最新的异常之一是:请使用EncoderConfig(EncoderConfig#inkdeContentTypeAs)来指定如何序列化此内容类型的数据
也有异常:没有找到类java.io的序列化程序。FileDESptor和没有发现创建BeanSerializer的属性(为了避免异常,禁用SerializationFeature。FAIL_ON_EMPTY_BEANS),但这一个用放心的配置修复了。

我无法更改DTO示例类字段类型。使用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);
  }

提前感谢您的想法。


共1个答案

匿名用户

你可以这样试试:

  private RequestSpecification baseRequest(){
        return given()
                .baseUri(BASE_URI)
                .basePath(basePath)
                .relaxedHTTPSValidation();}

baseRequest()
                .contentType(ContentType.MULTIPART)
                .formParams(formParams)
                .multiPart("content", file)
                .post(endpointURL);