#rest-assured
Вопрос:
В восстановленном состоянии мы можем передать полезную нагрузку запроса в методе тела различными способами, такими как
- Строка
- Объект POJO
- Объект Карты
- JSONObject (из библиотеки GSON)
- Файл и
- Поток ввода файлов
Итак, я создал следующий метод, используя универсальные средства для размещения всех этих типов: —
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 отлично работает только с : —
- Строка
- Объект POJO
- Объект Карты
- JSONObject (из библиотеки GSON)
But fails with remaining two: —
- File — Output is bad request 400
- 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; нет проблем.