Java Can';t创建列表<;节点>;对象,当列表包含一个元素时

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

我在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">
  <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仍然是相关的。