我在为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);
}
谢谢你提前给我出主意。
1条答案
按热度按时间jogvjijk1#
你可以这样尝试: