我正在研究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"));
}
请忽略一种测试方法中有多个断言。我知道这不是最佳做法,但我现在只是在“玩”研究材料。
是否有更好,更短,更流畅的方法来测试这两个值?也许直接在“安心放心”的情况下,而没有Gson?
谢谢!
答案 0 :(得分:1)
可能有几种方法,但我想仅使用RestAssured
来介绍一种特定的方法。
首先,您可以创建Java类来表示给定的JSON。您随时可以展开它。
创建一个类ResultsObject
(名称无关紧要)
public class ResultsObject {
public List<TypeObject> results;
}
我们声明RestAssured
必须寻找JSON对象的JSON数组。这些对象中的每一个都解析为TypeObject
(此名称也没有关系)。重要的是results
变量名。它与JSON中的results
匹配。
因此,现在我们必须创建TypeObject
类来表示每个JSON对象。
public class TypeObject {
public String type;
}
同样,类名无关紧要,重要的是type
变量名。就像在JSON中一样。
现在,使用单行代码,我们可以将JSON(从Response
或String
解析为我们创建的类,如下所示:
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.
这样的异常,您要做的就是向Maven添加jackson-databind
。 Rest Assured能够使用Gson
或Jackson
数据绑定将JSON转换为Java类。
您所需要的就是依赖性,并且您已经准备就绪。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.9</version>
</dependency>
我已经测试了解决方案。
它还使您可以灵活地处理数据,并且正如您所看到的,我仅使用了1个断言来比较JSON中的所有type
s。
希望有帮助!