Использование @Client в тесте Spock для загрузки многокомпонентных файлов HTTP в 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.

Любая помощь приветствуется.


person emazzotta    schedule 08.03.2019    source источник


Ответы (1)


Пожалуйста, попробуйте следующее:

@Client(value ="/v1/upload")
static interface UploadClient {

  @Post(uri = "/mailings", produces = MediaType.MULTIPART_FORM_DATA)
  HttpResponse postFile(@Body MultipartBody file)

}

Добавить продукцию и аннотацию тела

person Puneet Behl    schedule 08.03.2019
comment
Спасибо, produces = MediaType.MULTIPART_FORM_DATA и @Body были теми частями, которые мне не хватало - person emazzotta; 08.03.2019