Передача тела в восстановленном состоянии с использованием универсальных методов не работает для файла и потока ввода файлов

#rest-assured

Вопрос:

В восстановленном состоянии мы можем передать полезную нагрузку запроса в методе тела различными способами, такими как

  1. Строка
  2. Объект POJO
  3. Объект Карты
  4. JSONObject (из библиотеки GSON)
  5. Файл и
  6. Поток ввода файлов

Итак, я создал следующий метод, используя универсальные средства для размещения всех этих типов: —

 public lt;Tgt; Response postAMember(T body) {   return given().spec(this.spec).body(body).when().post(EndPoints.GET_ALL_POST_A_MEMBER).andReturn(); }  

Теперь, вот как я потребляю его для соответствующего типа (не все за один раз…по одному за раз): —

 @Test public void postMember() throws IOException {  // Using Hashmap  Maplt;String, Stringgt; body = new HashMaplt;gt;();  body.put("name", "Rocky");  body.put("gender", "Male");    // Using Model and GSON  Member imember = new Member("Rocky", "Male");  Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();  String body = gson.toJson(imember);    // Using JsonObject (GSON)  JsonObject body = new JsonObject();  body.addProperty("name", "Rocky");  body.addProperty("gender", "Male");    // Using Payload JSON File  File body = new File("src/test/resources/Payloads/postmemberpayload.json");    // Using Raw String  String body = "{rn"     " "name": "Rocky",rn"     " "gender": "Male"rn"     "}";    // Using FileInputStream  FileInputStream fis = new FileInputStream(body); // in this case I would pass fis to body method    Response resp = MemberService.getMemberServiceInstance().postAMember(body);  Assert.assertEquals(resp.getStatusCode(), StatusCode.CREATED_201);  Member omember = resp.getBody().as(Member.class);   System.out.println(omember.toString());  }  

Метод postAMember отлично работает только с : —

  1. Строка
  2. Объект POJO
  3. Объект Карты
  4. JSONObject (из библиотеки GSON)

But fails with remaining two: —

  1. File — Output is bad request 400
  2. FileInputStream — Вывод java.lang.Исключение IllegalArgumentException: jdk.internal.ref.PhantomCleanablelt;?gt; объявляет несколько полей JSON с именем next

А пока я должен сделать следующие еще две перегруженные версии postAMember: —

 public Response postAMember(File body) {   return given().spec(this.spec).body(body).when().post(EndPoints.GET_ALL_POST_A_MEMBER).andReturn(); }  public Response postAMember(FileInputStream body) {   return given().spec(this.spec).body(body).when().post(EndPoints.GET_ALL_POST_A_MEMBER).andReturn(); }  

Теперь вышеперечисленные два метода генерируют ответ. Есть какие-нибудь догадки, что здесь не так? Почему метод с генериками не может принимать файл и поток ввода файлов?

Я получил последние обновленные библиотеки из центрального репозитория maven.

Ответ №1:

Насколько я понимаю, ваш универсальный метод будет сопоставлен с body(Object object) оф RequestSpecification , затем он object будет сериализован.

 class RequestSpecificationImpl ...   RequestSpecification body(Object object) {  ...   this.requestBody = ObjectMapping.serialize(object, requestContentType,   findEncoderCharsetOrReturnDefault(requestContentType), null,   objectMappingConfig(), restAssuredConfig().getEncoderConfig());  ...  }  

Все перечисленные ниже виды объектов не имеют проблем с сериализацией.

  • Строка
  • Объект POJO
  • Объект Карты
  • JSONObject (из библиотеки GSON)

Но

  • Файл —сериализация—gt; полный путь к ФАЙЛУ
  • Поток ввода файлов —сериализация—gt; исключение (из Gson/Джексона)

Когда вы добавляете 2 метода, будьте уверены, что они правильно сопоставлены body(File body) и body(InputStream body) — gt; для них нет сериализации — gt; gt; нет проблем.