programing

REST 보증 - 범용 리스트의 시리얼화 해제

linuxpc 2023. 4. 1. 08:31
반응형

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/");

이건 내 사건이야

이제 사용할 수 있습니다.TypeRefJsonPath 라이브러리를 사용하여 가능한 한 많은 작업을 수행할 수 있습니다.

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

반응형