我有一个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自动计算的泛型类型而产生的警告或错误。