Rest 请放心:Isn';难道没有更好的方法来测试一系列结果吗?
我现在正在研究“放心框架” 使用一些API,我得到以下(部分)JSON响应:Rest 请放心:Isn';难道没有更好的方法来测试一系列结果吗?,rest,rest-assured,rest-assured-jsonpath,Rest,Rest Assured,Rest Assured Jsonpath,我现在正在研究“放心框架” 使用一些API,我得到以下(部分)JSON响应: { "results": [ { "type": "AAAA" }, { "type": "A" } ] } 我正在尝试验证这些类型。 到目前为止,我找到的唯一方法是使用gson将字符串转换为对象,然后断言: @Given("^test2$") public void test2$() {
{
"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"));
}
请忽略一个测试方法中有多个断言。我知道这不是最佳实践,但我现在只是“玩”来学习材料
是否有更好、更短、更流畅的方法来测试这两个值?也许直接使用Rest Assured,而不使用Gson
谢谢 可能有几种方法,但我想介绍一种具体的方法,只使用
重新启动
首先,您可以创建Java类来表示给定的JSON。你可以随时扩展它
创建一个类ResultsObject
(名称无关紧要)
同样,类名并不重要,重要的是type
变量名。就像在JSON中一样
现在,通过单行代码,我们可以将JSON(从响应
或字符串
)解析为我们创建的类,如下所示:
List<String> types = resultsObject.results.stream().map(x -> x.type).collect(Collectors.toList());
ResultsObject results=response.jsonPath().get(“$”,ResultObject.class)代码>
进一步的工作需要创建断言
MatcherAssert.assertThat(types, Matchers.hasItems("AAAA", "A")); //you can use static imports if you'd like.
断言来自Hamcrest
,该断言已包含在restassed
中。它将字符串数组与我们选择的字符串数组相匹配
您可以注意到,类型
尚未初始化。我们需要一个字符串数组,但它是一个TypeObject
数组。我们可以使用Java流API
简单地将其转换如下:
List<String> types = resultsObject.results.stream().map(x -> x.type).collect(Collectors.toList());
我已经测试了解决方案。
它还为您提供了处理数据的灵活性,如您所见,我只使用了一个断言来比较JSON中的所有类型
希望有帮助 @dushkin没问题。让我知道它是否按您所希望的方式工作:)请记住,在方法getObject
中,我将$
作为根插入。如果results
array在下,例如query.data
,那么您必须将$
更改为query.data
,并且它将工作:)
List<String> types = resultsObject.results.stream().map(x -> x.type).collect(Collectors.toList());
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.9</version>
</dependency>