在 Spock 测试中使用 @Client 在 Micronaut 中进行 HTTP 分段文件上传
Using @Client in Spock Test for HTTP Multipart File Upload in Micronaut
我的 Micronaut 文件上传控制器(在 Java 中)有以下签名:
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces("application/json")
@Post
public Single<IdType> uploadFile(Publisher<CompletedFileUpload> files)
我有以下有效的 Spock 测试(在 Groovy 中):
@MicronautTest
class UploadSpecification extends Specification implements CsvFileBuilder {
@Inject
@Client('/')
HttpClient client
@Shared
List<String> allowedMimeTypes = List.of("text/csv", "application/vnd.ms-excel")
@Unroll
void "upload mailings csv with content type #mediaType"() {
given:
MultipartBody multipartBody = MultipartBody
.builder()
.addPart("files", "myfile.csv", new MediaType(mediaType), createCsvAsBytes(buildCsv()))
.build()
when:
HttpResponse response = client.toBlocking()
.exchange(POST("/v1/mailings", multipartBody).contentType(MediaType.MULTIPART_FORM_DATA_TYPE))
then:
response.status == HttpStatus.OK
where:
mediaType << allowedMimeTypes
}
}
关于测试,我想更改的是:我不想使用在测试顶部注入的标准 HttpClient
,我想使用这样的东西:
@Inject
UploadClient uploadClient
@Client(value = "/v1/mailings")
static interface UploadClient {
@Post
HttpResponse postFile(...)
}
我的问题是,客户端的postFile
需要什么签名?我是否仍然可以使用 MultipartBody
但不知何故将其转换为 CompletedFileUpload
?我真的不确定如何解决这个问题,而且我是 RxJava
.
的初学者
感谢任何帮助。
请尝试以下操作:
@Client(value ="/v1/upload")
static interface UploadClient {
@Post(uri = "/mailings", produces = MediaType.MULTIPART_FORM_DATA)
HttpResponse postFile(@Body MultipartBody file)
}
添加产品和正文注释
我的 Micronaut 文件上传控制器(在 Java 中)有以下签名:
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces("application/json")
@Post
public Single<IdType> uploadFile(Publisher<CompletedFileUpload> files)
我有以下有效的 Spock 测试(在 Groovy 中):
@MicronautTest
class UploadSpecification extends Specification implements CsvFileBuilder {
@Inject
@Client('/')
HttpClient client
@Shared
List<String> allowedMimeTypes = List.of("text/csv", "application/vnd.ms-excel")
@Unroll
void "upload mailings csv with content type #mediaType"() {
given:
MultipartBody multipartBody = MultipartBody
.builder()
.addPart("files", "myfile.csv", new MediaType(mediaType), createCsvAsBytes(buildCsv()))
.build()
when:
HttpResponse response = client.toBlocking()
.exchange(POST("/v1/mailings", multipartBody).contentType(MediaType.MULTIPART_FORM_DATA_TYPE))
then:
response.status == HttpStatus.OK
where:
mediaType << allowedMimeTypes
}
}
关于测试,我想更改的是:我不想使用在测试顶部注入的标准 HttpClient
,我想使用这样的东西:
@Inject
UploadClient uploadClient
@Client(value = "/v1/mailings")
static interface UploadClient {
@Post
HttpResponse postFile(...)
}
我的问题是,客户端的postFile
需要什么签名?我是否仍然可以使用 MultipartBody
但不知何故将其转换为 CompletedFileUpload
?我真的不确定如何解决这个问题,而且我是 RxJava
.
感谢任何帮助。
请尝试以下操作:
@Client(value ="/v1/upload")
static interface UploadClient {
@Post(uri = "/mailings", produces = MediaType.MULTIPART_FORM_DATA)
HttpResponse postFile(@Body MultipartBody file)
}
添加产品和正文注释