POJO Artwork
を持っています。 JSON形式のHTTP応答本文で、RESTful WebサービスからこれらのオブジェクトのList
を取得しています。返されたリストを分析するRest Assuredベースのテストを作成しようとしています。コードは次のようになります。
Response response = get("/artwork");
List returnedArtworks = response.getBody().as(List.class)
問題は、Rest Assuredが返されたJSONをList<Artwork>
として解析できないことです。代わりに、List<LinkedHashMap>
を取得します。マップは適切な構造を持っています。つまり、JacksonによってArtwork
オブジェクトにマップできますが、手動でマップすることは避けたいです。
私のモデルのJSONマッピングは問題ありません。これは、次のように単一のオブジェクトをマッピングするときです。
Artwork returnedArtwork = response.getBody().as(Artwork.class);
それは正常に動作します。
returnedArtworks
をList<Artwork>
として取得することはできますか?
あなたはこれを行うことができます:
List<Artwork> returnedArtworks = Arrays.asList(response.getBody().as(Artwork[].class));
トリックは、JSONをオブジェクトの配列に逆シリアル化して(配列またはリストのJSON文字列に違いがないため)、配列をリストに変換することです。
このソリューションはバージョン3.0.2(io.restassured)で機能します。
JsonPath jsonPath = RestAssured.given()
.when()
.get("/order")
.then()
.assertThat()
.statusCode(Response.Status.OK.getStatusCode())
.assertThat()
.extract().body().jsonPath();
List<Order> orders = jsonPath.getList("", Order.class);
これにより、次のような構造のオブジェクトが抽出されます。
public class Order {
private String id;
public String getId(){
return id; }
public void setId(String id){
this.id = id;
}
}
指定されたjsonで:
[
{ "id" : "5" },
{ "id" : "6" }
]
GoogleのGsonライブラリを使用すると、簡単に解析してList<Artwork>
。以下のコードを試してください
Gson gson = new Gson();
List<Artwork> returnedArtworks = gson.fromJson(jsonStr, new TypeToken<List<Artwork>>(){}.getType());
//* where jsonStr is the response string(Json) receiving from your Restful webservice
REST確実な3.0.2を使用すると、コンテンツが配列に存在するかどうかを簡単に確認できます
when().get("/artwork").then().body("artworks", hasItem("some art");
//or check multiple values in array
when().get("/artwork").then().body("artworks", hasItems("some art", "other art");
このように、JSONを変換してコードの複雑さを回避し、応答コンテンツを確認する方法の例をさらにリストします link
安心して as(Java.lang.reflect.Type)
を質問の中で使用されるClass
を期待するバージョンの横に提供してください。
Java.lang.reflect.Type type; //TODO defines the type.
Response response = get("/artwork");
List<Artwork> returnedArtworks = response.getBody().as(type)
私の意見では、type
変数は、使用されるシリアライゼーションライブラリに依存します。
プルショットハムの答え で指摘されているように、Gsonを使用している場合は、TypeToken
を使用できます。私は安心して直接それを使用することを好みます:
Type type = new TypeToken<List<Artwork>>(){}.getType();
Response response = get("/artwork");
List<Artwork> returnedArtworks = response.getBody().as(type)
ジャクソンを使用する場合の解決策は、TypeFactory
( javadoc 、 source )を使用して、逆シリアル化する必要がある型を指定することです。
Type type = TypeFactory.defaultInstance().constructCollectionLikeType(ArrayList.class, Artwork.class);
Response response = get("/artwork");
List<Artwork> returnedArtworks = response.getBody().as(type)