请放心:难道没有更好的方法来测试一系列结果吗?
Rest Assured: Isn't there a better way to test an array of results?
正在研究Rest Assured框架
使用一些 API 我得到以下(部分)JSON 响应:
{
"results": [
{
"type": "AAAA"
},
{
"type": "A"
}
]
}
我正在尝试验证类型。
到目前为止我发现的唯一方法是使用 gson 将字符串转换为对象然后断言:
@Given("^test2$")
public void test2$() {
RestAssured.baseURI = BASE_URI;
String response =
given()
.param(KEY_KEY, API_KEY)
.param(URL_KEY, URL_TO_CHECK)
.when()
.get(RESOURCE)
.asString();
System.out.println(response);
GsonBuilder builder = new GsonBuilder();
builder.setPrettyPrinting();
Gson gson = builder.create();
WhtResponse whtResponse = gson.fromJson(response, WhtResponse.class);
assertTrue(whtResponse.getResults().size() == 2);
assertTrue(whtResponse.getResults().get(0).getType().equals("AAAA"));
assertTrue(whtResponse.getResults().get(1).getType().equals("A"));
}
请忽略一个测试方法中有多个断言。我知道这不是最佳实践,但我现在 "playing" 正在研究 material。
是否有更好、更短、更流畅的方法来测试这两个值?也许直接使用 Rest Assured 而不使用 Gson?
谢谢!
可能有几种方法,但我想介绍一种具体的方法,仅使用 RestAssured
。
首先,您可以创建 Java classes 来表示给定的 JSON。您可以随时扩展它。
创建一个 class ResultsObject
(名称无关紧要)
public class ResultsObject {
public List<TypeObject> results;
}
我们声明 RestAssured
必须寻找 JSON 个 JSON 对象数组。这些对象中的每一个都被解析为 TypeObject
(这个名称也无关紧要)。重要的是 results
变量名。它匹配 JSON.
中的 results
所以,现在我们必须创建 TypeObject
class 来代表每个 JSON 对象。
public class TypeObject {
public String type;
}
同样,class 名称并不重要,重要的是 type
变量名称。就像 JSON.
现在,使用 单行代码 我们可以将 JSON(来自 Response
或 String
)解析为 class我们是这样创建的:
ResultsObject results = response.jsonPath().get("$", ResultObject.class);
进一步的工作需要创建断言。
MatcherAssert.assertThat(types, Matchers.hasItems("AAAA", "A")); //you can use static imports if you'd like.
断言来自 Hamcrest
,已包含在 RestAssured
中。它将字符串数组与我们选择的字符串数组相匹配。
您可以注意到,types
尚未初始化。我们需要一个字符串数组,但它是一个 TypeObject
数组。我们可以像这样使用 Java Stream API
简单地转换它:
List<String> types = resultsObject.results.stream().map(x -> x.type).collect(Collectors.toList());
就是这样!
但是,如果您得到这样的异常 Cannot deserialize object because no JSON deserializer found in classpath. Please put either Jackson (Databind) or Gson in the classpath.
,您所要做的就是将 jackson-databind
添加到 Maven。 Rest Assured 能够使用 Gson
或 Jackson
数据绑定将 JSON 转换为 Java classes。
您只需要依赖项,一切就绪。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.9</version>
</dependency>
我已经测试了解决方案。
它还为您提供了处理数据的灵活性,如您所见,我仅使用了 1 个断言来比较 JSON.
中的所有 type
希望对您有所帮助!
正在研究Rest Assured框架
使用一些 API 我得到以下(部分)JSON 响应:
{
"results": [
{
"type": "AAAA"
},
{
"type": "A"
}
]
}
我正在尝试验证类型。 到目前为止我发现的唯一方法是使用 gson 将字符串转换为对象然后断言:
@Given("^test2$")
public void test2$() {
RestAssured.baseURI = BASE_URI;
String response =
given()
.param(KEY_KEY, API_KEY)
.param(URL_KEY, URL_TO_CHECK)
.when()
.get(RESOURCE)
.asString();
System.out.println(response);
GsonBuilder builder = new GsonBuilder();
builder.setPrettyPrinting();
Gson gson = builder.create();
WhtResponse whtResponse = gson.fromJson(response, WhtResponse.class);
assertTrue(whtResponse.getResults().size() == 2);
assertTrue(whtResponse.getResults().get(0).getType().equals("AAAA"));
assertTrue(whtResponse.getResults().get(1).getType().equals("A"));
}
请忽略一个测试方法中有多个断言。我知道这不是最佳实践,但我现在 "playing" 正在研究 material。
是否有更好、更短、更流畅的方法来测试这两个值?也许直接使用 Rest Assured 而不使用 Gson?
谢谢!
可能有几种方法,但我想介绍一种具体的方法,仅使用 RestAssured
。
首先,您可以创建 Java classes 来表示给定的 JSON。您可以随时扩展它。
创建一个 class ResultsObject
(名称无关紧要)
public class ResultsObject {
public List<TypeObject> results;
}
我们声明 RestAssured
必须寻找 JSON 个 JSON 对象数组。这些对象中的每一个都被解析为 TypeObject
(这个名称也无关紧要)。重要的是 results
变量名。它匹配 JSON.
results
所以,现在我们必须创建 TypeObject
class 来代表每个 JSON 对象。
public class TypeObject {
public String type;
}
同样,class 名称并不重要,重要的是 type
变量名称。就像 JSON.
现在,使用 单行代码 我们可以将 JSON(来自 Response
或 String
)解析为 class我们是这样创建的:
ResultsObject results = response.jsonPath().get("$", ResultObject.class);
进一步的工作需要创建断言。
MatcherAssert.assertThat(types, Matchers.hasItems("AAAA", "A")); //you can use static imports if you'd like.
断言来自 Hamcrest
,已包含在 RestAssured
中。它将字符串数组与我们选择的字符串数组相匹配。
您可以注意到,types
尚未初始化。我们需要一个字符串数组,但它是一个 TypeObject
数组。我们可以像这样使用 Java Stream API
简单地转换它:
List<String> types = resultsObject.results.stream().map(x -> x.type).collect(Collectors.toList());
就是这样!
但是,如果您得到这样的异常 Cannot deserialize object because no JSON deserializer found in classpath. Please put either Jackson (Databind) or Gson in the classpath.
,您所要做的就是将 jackson-databind
添加到 Maven。 Rest Assured 能够使用 Gson
或 Jackson
数据绑定将 JSON 转换为 Java classes。
您只需要依赖项,一切就绪。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.9</version>
</dependency>
我已经测试了解决方案。 它还为您提供了处理数据的灵活性,如您所见,我仅使用了 1 个断言来比较 JSON.
中的所有type
希望对您有所帮助!