当列表包含一个元素时无法创建 List<Node> 对象
Can't create List<Node> object when list contains one element
我在 Java 测试中使用放心的 2.8.0 库。当我从放心的字符串响应创建一个 xmlPath 并尝试创建一个节点列表时,如果列表只包含一个元素,我会得到一个异常。
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>
发生这种情况是因为在 xml-path-2.8.0-sources.jar!/com/jayway/restassured/assertion/XMLAssertion.groovy
中 Groovy 到 Java 的转换行为非常奇怪
看看发生了什么:
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("commentary.messages.period.message.@id", String.class);
我在 Java 测试中使用放心的 2.8.0 库。当我从放心的字符串响应创建一个 xmlPath 并尝试创建一个节点列表时,如果列表只包含一个元素,我会得到一个异常。
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>
发生这种情况是因为在 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("commentary.messages.period.message.@id", String.class);