MockHttpServletResponse:检查xml内容

尼尔·德·湿

我正在使用测试控制器MockMvc这是响应的样子:

MockHttpServletResponse:
              Status = 200
       Error message = null
             Headers = {Content-Type=[text/xml]}
        Content type = text/xml
                Body = <?xml version="1.0" encoding="UTF-8" standalone="yes"?><ns2:diagnosisCode xmlns:ns2="http://schemas.mycompany.co.za/health" effectiveStartDate="2014-03-05T00:00:00+02:00" effectiveEndDate="2014-03-05T23:59:59.999+02:00" diagnosisId="1"><diagnosisCodeId><codingSchemaCode>irrelevant schema</codingSchemaCode><diagnosisCode>irrelevant code</diagnosisCode></diagnosisCodeId></ns2:diagnosisCode>
       Forwarded URL = null
      Redirected URL = null
             Cookies = []

Body的印刷精美版本

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:diagnosisCode xmlns:ns2="http://schemas.mycompany.co.za/health" effectiveStartDate="2014-03-05T00:00:00+02:00" effectiveEndDate="2014-03-05T23:59:59.999+02:00" diagnosisId="1">
    <diagnosisCodeId>
        <codingSchemaCode>irrelevant schema</codingSchemaCode>
        <diagnosisCode>irrelevant code</diagnosisCode>
    </diagnosisCodeId>
</ns2:diagnosisCode>

通话MockMvc看起来像

mockMvc.perform(
        get("/diagnostic/diagnosisCodes/{schema}/{code}", IRRELEVANT_SCHEMA, IRRELEVANT_CODE).accept(MediaType.TEXT_XML))
        .andDo(print())
        .andExpect(content().contentType(MediaType.TEXT_XML))
        .andExpect(status().isOk())
        .andExpect(xpath("diagnosisCodeId/diagnosisCode").string(IRRELEVANT_CODE))
        .andExpect(xpath("diagnosisCodeId/codingSchemaCode").string(IRRELEVANT_SCHEMA));

我敢肯定我误会了我应该如何在这里使用XPath,但是为什么这个断言失败了?我的期望是什么样的?

java.lang.AssertionError: XPath diagnosisCode expected:<irrelevant code> but was:<>
詹斯原为

我不确定XPath上下文是什么(或它是否是文档节点),但是我看到了两个可能的问题,并且猜测两者都适用:

  • 您尝试匹配< diagnosisCodeId/>作为根元素的元素。没有,但它们是的孩子<diagnosisCode>为根节点包括一个轴步(可能是更好的方法),或者在查询前使用该descendant-or-self轴步//

    /diagnosisCode/diagnosisCodeId/diagnosisCode
    //diagnosisCodeId/diagnosisCode
    
  • 该文档使用名称空间(用于根元​​素)。除了上述的根元素问题外,还可以注册该名称空间(更好的解决方案,但我不知道如何在Spring MVC中执行此操作),或者使用以下变通办法忽略它:

    /*[local-name() = 'diagnosisCode']/diagnosisCodeId/diagnosisCode
    

    首先匹配所有子节点,然后限制为具有适当元素名称的节点(忽略名称空间)。

    通过添加XPath 2.0支持(例如,包括Saxon作为library),您还可以使用通配符名称空间匹配器:

    /*:diagnosisCode/diagnosisCodeId/diagnosisCode
    

    如果将名称空间URI注册http://schemas.mycompany.co.za/healthns2,查询将类似于

    /ns2:diagnosisCode/diagnosisCodeId/diagnosisCode
    

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章