Java Can';t创建列表<;节点>;对象,当列表包含一个元素时
我在Java测试中使用了rest assured 2.8.0库。当我从rest-assured字符串响应创建xmlPath并尝试创建节点列表时,如果列表仅包含一个元素,则会出现异常Java Can';t创建列表<;节点>;对象,当列表包含一个元素时,java,rest-assured,Java,Rest Assured,我在Java测试中使用了rest assured 2.8.0库。当我从rest-assured字符串响应创建xmlPath并尝试创建节点列表时,如果列表仅包含一个元素,则会出现异常 List<Node> nodeList = xmlPath.getList("commentary.messages.period.message", Node.class); <commentary xmlns:basketballdata="www.nba.com"> <mat
List<Node> nodeList = xmlPath.getList("commentary.messages.period.message", Node.class);
<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个元素时,我不会得到这个异常。请帮忙:)
下面是xml结构,如果有一个消息节点,它不会创建包含一个元素的列表
List<Node> nodeList = xmlPath.getList("commentary.messages.period.message", Node.class);
<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>
俄克拉荷马城雷霆队vs休斯顿火箭队
篮球
但如果我有两个消息节点,它将创建一个包含两个元素的列表
<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>
俄克拉荷马城雷霆队vs休斯顿火箭队
篮球
发生这种情况是因为xml-path-2.8.0-sources.jar中Groovy到Java的转换行为非常奇怪/com/jayway/restassered/assertion/xmlasertion.groovy
看看发生了什么:
private def toJavaObject(nodes, isAttributes, forceList) {
if (nodes.size() == 1 && !hasChildren(nodes, isAttributes)) {
return nodes.text()
} else {
return toJavaList(nodes, isAttributes, forceList)
}
}
如果节点列表仅由一个没有子元素的元素组成,则根据此实现,此元素无权成为节点。它被转换为字符串
。这会在以后的代码中触发一个ClassCastException
,因为您需要一个节点
并获得一个字符串
因此,获取节点列表似乎是失败的。你不能用它。您必须找到适合您的测试场景的解决方案。例如,可以通过字符串列表访问属性:
List<String> nodeList = xmlPath.getList("commentary.messages.period.message.@id", String.class);
List nodeList=xmlPath.getList(“commentation.messages.period.message@id”,String.class);
发生这种情况是因为xml-path-2.8.0-sources.jar中Groovy到Java的转换行为非常奇怪/com/jayway/restassered/assertion/xmlasertion.groovy
看看发生了什么:
private def toJavaObject(nodes, isAttributes, forceList) {
if (nodes.size() == 1 && !hasChildren(nodes, isAttributes)) {
return nodes.text()
} else {
return toJavaList(nodes, isAttributes, forceList)
}
}
如果节点列表仅由一个没有子元素的元素组成,则根据此实现,此元素无权成为节点。它被转换为字符串
。这会在以后的代码中触发一个ClassCastException
,因为您需要一个节点
并获得一个字符串
因此,获取节点列表似乎是失败的。你不能用它。您必须找到适合您的测试场景的解决方案。例如,可以通过字符串列表访问属性:
List<String> nodeList = xmlPath.getList("commentary.messages.period.message.@id", String.class);
List nodeList=xmlPath.getList(“commentation.messages.period.message@id”,String.class);
能否显示导致异常的数据示例和未导致异常的数据示例?我添加了一个示例xml。我希望这会有所帮助。我认为这是bug/特性,一个元素-不是列表,两个或更多-列表。Catch类cast exception和get as single element能否显示导致异常和未导致异常的数据示例?我添加了一个示例xml。我希望这会有所帮助。我认为这是bug/特性,一个元素-不是列表,两个或更多-列表。捕获类强制转换异常并作为单个元素获取谢谢@nolexa,这个解决方法适合我。我测试的目的是验证属性。不幸的是,由于列表不能用一个元素创建,所以这个bug仍然是相关的。谢谢@nolexa,这个解决方法适合我。我测试的目的是验证属性。不幸的是,由于不能用一个元素创建列表,所以这个bug仍然是相关的。