RestAssured和GPath表达式属性不一致

时间:2014-06-03 17:44:09

标签: java namespaces rest-assured xmlslurper gpath

我们使用REST保证的框架在Java中进行一些单元/集成测试。

REST服务的XML答案与此类似:

<?xml version="1.0" encoding="UTF-8"?>
<Items xmlns="urn:service:com:namespace:item/1"
    returned="3" found="3">

    <ItemRef object="urn:svc:com:car:item:123456" type="door">door-123456.pdf</ItemRef>
    <ItemRef object="urn:svc:com:car:item:983425" type="mirror">mirror-43562577.pdf</ItemRef>
    <ItemRef object="urn:svc:com:car:item:983425" type="wheel" >door-94584854.pdf</ItemRef>    
</Items>

在我的测试中,我有兴趣通过阅读属性returned来检查返回的项目数量

givenOK()
    .expect()
        .body("Items.@returned", equalTo("3")) // this is a string
    .when()
    .get(myurl)

效果很好

现在我也想控制xmlns中的URN是否正确,具有相同的逻辑:

givenOK()
    .expect()
        .body("Items.@returned", equalTo("3")) // this is a string
        .body("Items.@xmlns", equalTo("urn:service:com:namespace:item/1"))
    .when()
    .get(myurl)

但是当我的测试运行时,表达式Items.@xmlns似乎没有返回属性的值而是空的:[]

知道为什么这不起作用吗?

1 个答案:

答案 0 :(得分:1)

是否可以特别处理“xmlns”属性,因为它表示命名空间?

可能的解决方法是在XmlConfig中声明命名空间并验证正文中的内容。

given().
        config(RestAssured.config().xmlConfig(XMLConfig.xmlConfig().declareNamespace("ns", "urn:service:com:namespace:item/1"))).
when().
        get(myUrl).
then().
        body("'ns:ItemRef'[0]", equalTo("door-123456.pdf"));

另一个具有多个节点和属性(显式路径)的示例:

given()
    .config(
        RestAssured.config()
            .xmlConfig(XmlConfig.xmlConfig()
                .declareNamespace("ns", "urn:service:com:namespace:item/1"))).
    when()
        .get(myUrl)
    .then()
        .body("'ns:RootNode'.'ns:Level1'.'ns:Level2'[0].'@ns:id'", equalTo("AN-ID-123"));