1

我正在为我的JUnit测试使用XMLUnit ,并且我想对其进行配置以忽略与某些类型的替代(但等效)呈现相关的差异。例如vs字段。我想一个完整的解决方案需要测试是 XSD 感知的,以便每个字段的类型都是已知的,并且在所有情况下都进行细微的比较(例如/甚至可能甚至考虑到默认属性值)。无论如何,我愿意接受变通办法,这样我就可以在没有所有这些错误警报的情况下运行我的测试。3.143.140xs:floattrue1xs: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);
    }    
}
4

2 回答 2

4

XMLUnit 不支持模式,因此完整的解决方案会非常复杂。要走的路是实现一个自定义的DifferenceListener.

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

于 2015-02-03T18:48:01.733 回答
1

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

无论如何,这个解决方案让我既可以使用@Dave 在对我的原始问题的评论中建议的测试方法,也可以使用更严格的测试,即要求在一轮内部化序列化之后生成相同的 XML。

于 2015-02-07T14:24:49.107 回答