REST 보증 - 범용 리스트의 시리얼화 해제
자바가 있다고 칩시다.Person
클래스:
class Person {
String name;
String email;
}
REST Assured를 사용하면 이 JSON 개체를 역직렬화할 수 있습니다.
{"name":"Bob", "email":"bob@email.com"}
자바에 대해서Person
인스턴스 사용
Person bob = given().when().get("person/Bob/").as(Person.class);
REST Assured를 사용하여 이 JSON 어레이를 역직렬화하는 방법
[{"name":"Bob", "email":"bob@email.com"},
{"name":"Alice", "email":"alice@email.com"},
{"name":"Jay", "email":"jay@email.com"}]
에List<Person>
예를 들어, 이것은 편리합니다.
List<Person> persons = given().when().get("person/").as(...);
나는 내가 원하는 것을 성취할 방법을 찾았다.
List<Person> persons = given().when().get("person/").as(Person[].class);
업데이트: Rest-Assured 1.8.1을 사용하면 목록으로 캐스팅이 더 이상 지원되지 않는 것 같습니다.다음과 같이 어레이를 선언하고 객체화해야 합니다.
Person[] persons = given().when().get("person/").as(Person[].class);
JSON API 응답에서 어레이가 아닌 Java 목록을 추출하려면jsonPath
보다는as
:
List<Person> persons = given()
.when()
.get("/person")
.then()
.extract()
.body()
// here's the magic
.jsonPath().getList(".", Person.class);
json 경로는 신체에 json 개체 목록이 있을 것으로 예상되는 모든 위치를 가리킬 수 있습니다.이 예에서는 json 루트만 가리키고 있습니다.
sidenode: rest-rest-rest-rest는 내부적으로 역직렬화에 잭슨을 사용하고 있습니다(용)..jsonPath
게다가.as
)
더 이상 통용되지 않는다는 것을 알게 된 사람들을 위해.
List<Entity> list = new ArrayList<>();
list = given()
.contentType(CONTENT_TYPE)
.when()
.get(getRestOperationPath())
.then()
.extract().body().as(list.getClass());
getRestOperationPath가 rest 작업 경로를 반환하고 CONTENT_TYPE이 콘텐츠 유형의 플레이스 홀더(예: application/json)임을 이해하시기 바랍니다.
update: 다른 버전을 체크합니다.버전에 따라 동작이 다르므로 다른 접근방식을 시도해 보는 것이 좋습니다.
upd2: 클리너 솔루션은 @Arigion에 의해 코멘트로 지적되었습니다.
to use .extract().body().jsonPath().getList(".", Entity.class);
expect()를 사용하는 경우에도 이 작업을 수행할 수 있습니다.
expect().
body("get(0).firstName", equalTo("Mike")).
when().
get("person/");
이건 내 사건이야
이제 사용할 수 있습니다.TypeRef
JsonPath 라이브러리를 사용하여 가능한 한 많은 작업을 수행할 수 있습니다.
List<Person> persons = given().when().get("person/")
.as(new TypeRef<List<Person>>() {});
https://github.com/json-path/JsonPath#what-is-returned-when과 마찬가지로 익명의 내부 클래스new TypeRef<List<Person>>() {}
는 유형 삭제를 회피하고 프레임워크가 원시 유형에 액세스할 수 있을 만큼 유형 정보를 캡처합니다.List
이 경우는,내부 범용 유형 -Person
- 이 상황에서 만들 수 있는 안전한 캐스팅입니다.
아직 찾는 사람이 있다면요Java 1.8 및 Rest Assured 2.9를 사용하면 솔루션은 매우 간단하며 "체크되지 않은 경고"가 발생하지 않습니다.
return Arrays.asList(given()
.when()
.get("restPath")
.then()
.extract()
.response()
.body()
.as(Player[].class));
Json Path가 불편하다면 GSON 또는 Jackson을 사용한 Java serialization/de-serialization을 사용하는 것이 좋습니다.
이 방법은 도움이 될 것입니다. 현재 버전의 안정 상태에서 작동합니다.
@Test
public void apostUser() {
Map<String,String> user = new HashMap<>();
user.put("User_Id", "xyx1111");
user.put("First_Name", "KS");
user.put("Designation", "DR");
given()
.contentType("application/json")
.body(user)
.when().post("URI").then()
.statusCode(200);
}
맵하고 싶으니까
[{"name":"Bob", "email":"bob@email.com"},
{"name":"Alice", "email":"alice@email.com"},
{"name":"Jay", "email":"jay@email.com"}]
java 오브젝트로 이동합니다.
엔드포인트를 호출하는 동안 다음과 같이 사용자 목록에 직접 매핑할 수 있습니다.
List<Person> personList = given().when().get("person/").as(Person[].class);
사용자 클래스는 동일하게 유지되어야 합니다. 즉, 사용자 클래스를 수정할 필요가 없습니다.
public class Person{
String name;
String email;
}
언급URL : https://stackoverflow.com/questions/15531767/rest-assured-generic-list-deserialization
'programing' 카테고리의 다른 글
Jest를 사용한 후크를 사용한 리액트 기능 컴포넌트 테스트 (0) | 2023.04.01 |
---|---|
Springboot - validate @RequestBody (0) | 2023.04.01 |
리액트 훅 - show Component Update를 구현하려면 어떻게 해야 합니까? (0) | 2023.04.01 |
larabel과 같은 자체 DD() 함수를 쓰는 방법은 무엇입니까? (0) | 2023.04.01 |
원형 구조를 JSON으로 변환 -- 불만족스러운 필드를 찾을 수 있는 방법이 있습니까? (0) | 2023.03.27 |