XMLUnit - 比较两个XML响应

时间:2018-01-10 13:01:29

标签: java xml junit xmlunit

expectedResponseXml 1:

<?xml version="1.0" encoding="UTF-8"?>
<GetResponse xmlns="http://whatever.co.uk/xsd/nam/message/GetResponse/">
    <Success>
        <Case>
            <Mort>M123456</Mort>
            <Appl>01</Appl>
        </Case>
        <Decision>D</Decision>
        <ProcessingRoute>R</ProcessingRoute>
        <Score>99999</Score>
    </Success>
</GetResponse>

和actualResponseXml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<GetResponse xmlns:ns2="http://whatever.co.uk/xsd/nam/message/GetResponse/"> 
    <ns2:Success> 
        <ns2:Case> 
            <ns2:Mort>M123456</ns2:Mort> 
            <ns2:Appl>01</ns2:Appl> 
        </ns2:Case> 
        <ns2:Decision>D</ns2:Decision> 
        <ns2:ProcessingRoute>R</ns2:ProcessingRoute> 
        <ns2:Score>99999</ns2:Score> 
    </ns2:Success> 
</GetResponse>

错误消息是:

Expected child 'GetResponse' but was 'null' - comparing <GetResponse...> at /GetResponse[1] to <NULL>

比较代码:

Diff myDiffSimilar = DiffBuilder.compare(Input.fromString(actualResponseXml))
                                        .withTest(Input.fromString(expectedResponseXml))
                                        .checkForSimilar()
                                        .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byName))
                                        .build();

我已尝试从XMLUnit的官方github帐户和几个stackoverflow类似的问题来解决这个错误,我觉得这是一个差异,命名空间应该被differenceEngine忽略。从上面的代码中,我通过它们的String表示来比较两个xmls。当我取出checkForSimilar()时,我收到此错误

Expected namespace uri 'null' but was 'http://whatever.co.uk/xsd/nam/message/GetResponse/'

我的maven依赖是

<dependency>
    <groupId>org.xmlunit</groupId>
    <artifactId>xmlunit-legacy</artifactId>
    <version>2.5.0</version>
    <scope>test</scope>
</dependency>

任何帮助都将受到重视!

1 个答案:

答案 0 :(得分:0)

在解决了上面正确提到的这个问题是命名空间问题之后,我发现了问题所在。 在将jaxb对象编组为XML时,请避免使用QName(localPart)构造函数,因为这会给文档中已知和提及的问题带来不可预测的问题!

  

在XML上下文中,所有元素和属性名称都存在于   命名空间的上下文。在施工期间明确说明   QName有助于防止难以诊断XML有效性错误。该   构造函数QName(String namespaceURI,String localPart)和   QName(String namespaceURI,String localPart,String prefix)是   首选。 link here

为什么我有一个奇迹!!使用

marshaller.marshal(new JAXBElement(new QName(namespaceURI, localPart, NS_PREFIX), jaxbObject.getClass(), jaxbObject), outputStream);
在您的编组器上

删除不需要的命名空间并将其设置为默认值。