我正在使用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);
}
}
答案 0 :(得分:3)
XMLUnit不支持模式,因此完全解决方案会非常复杂。要做的是实现自定义DifferenceListener
。
example
包中包含一个FloatingPointTolerantDifferenceListener
,它可以完成您对任意文本节点或属性所需的操作,但它会对看起来像数字的所有内容执行此操作 - 并且它不会处理任何文本节点或属性其他模式类型或默认值。
答案 1 :(得分:1)
最后,我在应用程序层实现了这一点,通过使用(在内化期间)一个自定义Java类来表示xs:float
,它也“记住”它来自的确切String
表示,所以在后续序列化使用完全相同的String形式(当然,假设内化后它没有被应用程序逻辑改变)。实际上,此解决方案与在Java对象层处理xs:float
为java.lang.String
的更简单,更直接的解决方案之间的唯一区别是使用专用Float
提供的其他语义信息。类似的。
无论如何,这个解决方案允许我在评论中使用@Dave建议的测试方法和我原来的问题,以及在一轮之后要求生成相同的 XML的更严格的测试内化 - 序列化。