#java #api #testing #response #rest-assured
Вопрос:
Я использую Rest Assured (Java) для тестирования API API. Для определенного объекта я создал класс, назовем его «TestObject», который я передаю для отправки запросов на создание этого объекта в api. Теперь я хочу использовать маршрут GET для извлечения объекта в другой класс TestObject для проверки и дальнейшего использования.
Проблема: Поля моего тестового объекта, которые я хочу сохранить, заключены в объект «содержимое» в ответе JSON.
"Content": {
"CreatedAt": "2021-07-12T10:02:08.523Z",
"UpdatedAt": "2021-07-12T10:02:08.523Z",
"UUID": "5ba98999-f6a4-4ec1-8418-ed61022b5975"
}
Как я могу извлечь и сохранить объект «Содержимое» в свой класс TestObject?
В RestAssured есть метод, который напрямую извлекает ответ классу, но затем пытается сохранить содержимое непосредственно в переменной, чего я не хочу.
Ответ №1:
Возможно, вы можете использовать что-то подобное, сопоставив ответ непосредственно с вашим pojo, вместо того, чтобы сопоставлять его с ответом RestAssured:
Создайте POJO с именем TestObject
public class TestObject {
private ContentObject Content;
public ContentObject getContent() {
return Content;
}
@Override
public String toString() {
return "TestObject{"
"Content=" Content
'}';
}
public static class ContentObject {
private String CreatedAt;
private String UpdatedAt;
private String UUID;
public String getCreatedAt() {
return CreatedAt;
}
public String getUpdatedAt() {
return UpdatedAt;
}
public String getUUID() {
return UUID;
}
@Override
public String toString() {
return "ContentObject{"
"CreatedAt='" CreatedAt '''
", UpdatedAt='" UpdatedAt '''
", UUID='" UUID '''
'}';
}
}
}
Тогда вы можете использовать это как:
TestObject testObject = when().get("/your/endpoint").then().extract().as(TestObject.class);
System.out.println(testObject);
System.out.println(testObject.getContent());
Ответ №2:
Мое предложение-использовать Jackson / Gson. Пример кода был бы:
import com.fasterxml.jackson.databind.ObjectMapper;
import io.restassured.path.json.JsonPath;
import org.junit.jupiter.api.Test;
import java.util.Map;
public class ExampleTest {
@Test
void test1() {
String res = "{n"
" "MetaData": {n"
" n"
" },n"
" "Content": {n"
" "CreatedAt": "2021-07-13T06:54:32.000Z",n"
" "UpdatedAt": "2021-07-13T06:54:32.000Z",n"
" "UUID": "2acf44af-209e-4f71-a6e2-2c073dbaf288"n"
" }n"
"}";
Map<String, Object> json = JsonPath.from(res).get("Content");
ObjectMapper objectMapper = new ObjectMapper();
ObjectTest objectTest = objectMapper.convertValue(json, ObjectTest.class);
System.out.println(objectTest);
}
static class ObjectTest {
public String CreatedAt;
public String UpdatedAt;
public String UUID;
@Override
public String toString() {
return "ObjectTest{"
"CreatedAt='" CreatedAt '''
", UpdatedAt='" UpdatedAt '''
", UUID='" UUID '''
'}';
}
}
}
Я использую Джексона
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.3</version>
</dependency>
Комментарии:
1. Спасибо за ответ, но, к сожалению, это не работает. К сожалению, это не сохранит поля в объекте. Ответный ответ = api.getPartner(v); Строка res = response.body().asString(); System.out.println(res); Сопоставление<Строка, объект> json = JSONPath.from(res).get(«Содержимое»); Сопоставитель объектов Сопоставитель объектов = новый сопоставитель объектов(); Партнер testpartner = (Сопоставитель объектов.Значение преобразования(json, Partner.class)); System.out.println(testpartner.getName().toString());
2.
Partner testpartner = (objectMapper.convertValue(json, Partner.class));
Просто удалите лишние круглые скобки () здесь. Можете ли вы сказать мне, какую ошибку вы получили?3. Ошибка не возвращается, она просто не присваивается.
4. Вы не возражаете, если вы обновите ответ json, о котором идет речь, я попробую еще раз.
Response response = api.getPartner(v); response.prettyPrint();
5. { «Метаданные»: { }, «Содержимое»: { «Создано»: «2021-07-13T06:54:32.000 Z», «ОбновлеНо»: «2021-07-13T06:54:32.000 Z», «UUID»: «2acf44af-209e-4f71-a6e2-2c073dbaf288» } }