比较XML文件时忽略xs:float(和其他类型)表示差异

时间:2015-01-18 17:25:57

标签: java xml junit xmlunit

我正在使用XMLUnit进行JUnit测试,我想配置它以忽略与某些类型的替代(但等效)渲染相关的差异。例如。对于3.14字段,3.140 vs xs:float。我想一个完整的解决方案需要测试是XSD感知的,以便知道每个字段的类型,并在所有情况下进行细致的比较(例如true / 1 xs:boolean甚至可能甚至考虑到默认属性值)。无论如何,我愿意接受变通办法,以便我可以在没有所有误报的情况下运行我的测试。

SSCCE(没有JUnit机制,以便于复制)如下:

import org.custommonkey.xmlunit.XMLTestCase;
import org.custommonkey.xmlunit.XMLUnit;
import org.custommonkey.xmlunit.Diff;


class XMLTestCaseConcrete extends XMLTestCase {
}


public class FooMain {

    public static void main(String args[]) throws Exception {
        String s1 = "<a>180</a>";
        String s2 = "<a>180.0</a>";
        Diff diff = XMLUnit.compareXML(s1, s2);
        System.out.printf("difference below:\n------\n%s\n------\n", diff);
        XMLTestCase xmlTest = new XMLTestCaseConcrete();
        xmlTest.assertXMLEqual(s1, s2);
    }    
}

2 个答案:

答案 0 :(得分:3)

XMLUnit不支持模式,因此完全解决方案会非常复杂。要做的是实现自定义DifferenceListener

example包中包含一个FloatingPointTolerantDifferenceListener,它可以完成您对任意文本节点或属性所需的操作,但它会对看起来像数字的所有内容执行此操作 - 并且它不会处理任何文本节点或属性其他模式类型或默认值。

答案 1 :(得分:1)

最后,我在应用程序层实现了这一点,通过使用(在内化期间)一个自定义Java类来表示xs:float,它也“记住”它来自的确切String表示,所以在后续序列化使用完全相同的String形式(当然,假设内化后它没有被应用程序逻辑改变)。实际上,此解决方案与在Java对象层处理xs:floatjava.lang.String的更简单,更直接的解决方案之间的唯一区别是使用专用Float提供的其他语义信息。类似的。

无论如何,这个解决方案允许我在评论中使用@Dave建议的测试方法和我原来的问题,以及在一轮之后要求生成相同的 XML的更严格的测试内化 - 序列化。