如何获得RestAssured对象列表而不是对象数组?



我有一个RestAssured的测试自动化项目,我想让它在体系结构上进行开发,以便使代码可重用,测试脚本易于阅读。我有表示API请求和响应的类,也有DTO类。例如,下面是一个使用端点的类:

public class BreedsEndpoint extends EndpointTechnicalSteps{
public BreedsEndpoint(){
super();
}
public BreedsEndpoint search(RequestSpecification spec, String nameOfBreed) {
Response response = given().spec(spec)
.param("q", nameOfBreed)
.when()
.get("breeds/search/")
.thenReturn();
this.response = response;
return this;
}
}

如你所见,有一个父类EndpointTechnicalSteps,我想用它来处理来自端点的响应。例如,我想在EndpointTechnicalSteps中创建一个方法,该方法将从响应中返回对象列表,这里有一个问题。最新版本的RestAssured只支持这样的决策

Object[] objectArray = response.getBody().as(Object[].class);

我必须传递Object[].class作为参数。

下面是EndpointTechnicalSteps类的代码

public class EndpointTechnicalSteps {
protected Response response;
public <T> T getBodyAsList(Class<T> aClass) {
return response.getBody().as(aClass);
}
}

如果我调用,例如,getBodyAsList方法与Breed[].class参数,然后我得到数组Breed[] breeds

如何在EndpointTechnicalSteps中创建一个方法,将返回<T> List<T>即对象列表,但不是数组?

kmcakmak已经指出了解决方案。下面是一个代码:

public <T> List<T> getBodyAsListOf(Class<T> aClass) {
JsonPath jsonPath = response.getBody().jsonPath();
return jsonPath.getList("", aClass);
}

我找到的最好的版本如下:从返回类型中自动推断出列表的泛型类型。

private static List<LedgerAccountDto> getAllLedgerAccount() {
return given()
.when().get("/wallet/ledger_accounts/")
.then()
.statusCode(200)
.extract().as(new TypeRef<>() {});
}

在InteliJ或SonarLint中没有错误或警告,所以它似乎是最好的解决方案。

对于模板方法也很有效

private static <T> List<T> getAllLedgerAccount() {
return given()
.when().get("/wallet/ledger_accounts/")
.then()
.statusCode(200)
.extract().as(new TypeRef<>() {});
}

以这种方式使用

List<LedgerAccountDto> fetchedAccounts = getAllLedgerAccount();

这次也没有由于java自动计算的泛型类型而产生的警告或错误。

相关内容

  • 没有找到相关文章

最新更新