2016-02-05 6 views
1

Я использую в моих тестах Java 2.8. Когда я создаю xmlPath из остального гарантированного ответа String и пытаюсь создать список узлов, я получаю исключение, если List содержит только один элемент.Невозможно создать Список <Node> объект, когда список содержит один элемент

List<Node> nodeList = xmlPath.getList("commentary.messages.period.message", Node.class); 

Это должно дать мне список с одного элемента, но вместо этого я получаю исключение

Cannot convert class java.lang.String to interface com.jayway.restassured.path.xml.element.Node. java.lang.ClassCastException at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:408) at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:80) at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrapNoCoerce.callConstructor(ConstructorSite.java:105) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallConstructor(CallSiteArray.java:60) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:235) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:247) at com.jayway.restassured.internal.path.ObjectConverter.convertObjectTo(ObjectConverter.groovy:54) at com.jayway.restassured.path.xml.XmlPath.convertObjectTo(XmlPath.java:913) at com.jayway.restassured.path.xml.XmlPath.getAsList(XmlPath.java:879) at com.jayway.restassured.path.xml.XmlPath.getList(XmlPath.java:348) at com.performgroup.usbasketballbackend.sprint26.USBask382Test.checkPlayerMainEventWithQualifierMessagesComments(USBask382Test.java:125) 

Когда у меня есть 2 элемента я не получаю это исключение. Пожалуйста, помогите :)

Ниже представлена ​​структура xml, и если есть один узел сообщения, он не создает список с одним элементом.

<commentary xmlns:basketballdata="www.nba.com"> 
    <matchInfo> 
    <description>Oklahoma City Thunder vs Houston Rockets</description> 
    <sport id="456">basketball</sport> 
    <competition id="1" name="NBA"> 
    <country id="123" name="USA"/> 
    </competition> 
    </matchInfo> 
    <messages> 
    <period id="1"> 
     <message id="123" homeScore="0" awayScore="0"/> 
    </period> 
    </messages> 
</commentary> 

Но если у меня есть 2 узла сообщений, он создает список из 2 элементов.

<commentary xmlns:basketballdata="www.nba.com"> 
    <matchInfo> 
    <description>Oklahoma City Thunder vs Houston Rockets</description> 
    <sport id="456">basketball</sport> 
    <competition id="1" name="NBA"> 
    <country id="123" name="USA"/> 
    </competition> 
    </matchInfo> 
    <messages> 
    <period id="1"> 
     <message id="123" homeScore="0" awayScore="0"/> 
     <message id="456" homeScore="2" awayScore="0"/> 
    </period> 
    </messages> 
</commentary> 
+1

Можете ли вы показать образцы данных, которые вызывают исключение, и тот, который этого не делает? – nolexa

+0

Я добавил образец xml. Надеюсь, это поможет. – BadNews

+0

Я думаю, что это ошибка/особенность, один элемент - не список, два или более - список. Catch class cast exception и получить как один элемент – Rustam

ответ

0

Это происходит из-за очень странное поведение в Groovy для преобразования Java в в xml-path-2.8.0-sources.jar!/com/jayway/restassured/assertion/XMLAssertion.groovy

Посмотрите, что происходит:

private def toJavaObject(nodes, isAttributes, forceList) { 
    if (nodes.size() == 1 && !hasChildren(nodes, isAttributes)) { 
     return nodes.text() 
    } else { 
     return toJavaList(nodes, isAttributes, forceList) 
    } 
} 

Если список узлов состоит из одного элемента без детей , этот элемент не имеет права быть узлом в соответствии с этой реализацией. Он преобразуется в String. Это вызывает ClassCastException в вашем коде позже, так как вы ожидаете Node и получаете String.

Таким образом, получение списка узлов кажется сломанным. Вы не можете его использовать. Вы должны найти обходное решение, которое соответствует вашему тестовому сценарию. Например, вы можете получить доступ к атрибутам в виде списка строк:

List<String> nodeList = xmlPath.getList("[email protected]", String.class); 
+0

Спасибо @nolexa, обходной путь работает для меня. Цель моих тестов состояла в том, чтобы проверить атрибуты в любом случае. К сожалению, ошибка остается актуальной, поскольку список не может быть создан одним элементом. – BadNews