【问题标题】:Using @Client in Spock Test for HTTP Multipart File Upload in Micronaut在 Spock 测试中使用 @Client 在 Micronaut 中进行 HTTP 多部分文件上传
【发布时间】:2026-01-03 13:50:01
【问题描述】:

我的 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 的初学者。

感谢任何帮助。

【问题讨论】:

    标签: java groovy multipartform-data spock micronaut


    【解决方案1】:

    请尝试以下操作:

    @Client(value ="/v1/upload")
    static interface UploadClient {
    
      @Post(uri = "/mailings", produces = MediaType.MULTIPART_FORM_DATA)
      HttpResponse postFile(@Body MultipartBody file)
    
    }
    

    添加产品和正文注释

    【讨论】:

    • 谢谢,produces = MediaType.MULTIPART_FORM_DATA@Body 是我缺少的部分
    最近更新 更多