RestAssured и выражение GPath для атрибута не согласованы

Мы используем инфраструктуру с поддержкой REST для выполнения некоторого модульного/интеграционного тестирования в Java.

Ответ XML от службы REST подобен этому:

<?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)

И это хорошо работает

Теперь я также хочу контролировать правильность URN в xmlns с той же логикой:

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 кажется не возвращающим значение атрибута, а пустым: []

Любая идея, почему это не работает?


person рüффп    schedule 03.06.2014    source источник


Ответы (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"));
person Johan    schedule 17.07.2014
comment
Возможно, но в xpath я могу использовать функцию namespace-uri(), но она не работает в контексте RESTAssured/GPATH. - person рüффп; 18.07.2014
comment
Второй xmlConfig() не работает как есть. Вместо этого мне пришлось использовать new XmlConfig(). - person рüффп; 12.04.2016
comment
@ruffp Вам нужно статически импортировать xmlConfig из XmlConfig - person Johan; 12.04.2016
comment
Отлично, я не нашел другого способа, но этот обходной путь работает хорошо, я также добавил еще один пример, чтобы прояснить, как использовать одинарные кавычки с несколькими элементами. - person рüффп; 12.04.2016