注意一下我是如何实例化 XMLUnit 的 setControlParser、setTestParser 和 setSAXParserFactory 方法的。您可以为这些值使用任何兼容 JAXP 的解析器。还要注意我是用 true 调用 setIgnoreWhitespace 的 —— 这是一根救命稻草,相信我!否则,不一致的空白会导致很多故障。
用 Diff 比较
Diff 类支持两种比较:identical 和 similar。如果所比较的文档在结构和值(如果设置了标志忽略空白)方面都完全相同,那么它们被认为是 identical;如果两个文档是完全相同的,那么它们也很自然的是 similar 的。反之,却不一定。
例如,清单 4 是与清单 5 相似的一个简单的 XML 代码片段,但二者并不相同:
清单 4. 一个帐号 XML 片段
<account>
<id>3A-00</id>
<name>acme</name>
</account>
清单 5 中的 XML 片段与清单 4 中所示的 XML 片段有相同的逻辑文档。但 XMLUnit 并不认为二者是相同的,原因是二者的 name 和 id 元素是颠倒的。
清单 5. 一个相似的 XML 片段
<account>
<name>acme</name>
<id>3A-00</id>
</account>
相应地,我可以编写测试用例来验证 XMLUnit 的行为,如清单 6 所示:
清单 6. 用来验证相同性和相似性的测试
public void testIdenticalAndSimilar() throws Exception {
String controlXML = "<account><id>3A-00</id><name>acme</name></account>";
String testXML = "<account><name>acme</name><id>3A-00</id></account>";
Diff diff = new Diff(controlXML, testXML);
assertTrue(diff.similar());
assertFalse(diff.identical());
}
相似和相同的 XML 文档之间的差异是很微小的;但若能验证两者却非常有用,例如在需要测试由不同应用程序或客户程序生成的文档的情况下。
验证结构
除了验证内容之外,您还需要验证 XML 文档的结构。在这种情况下,元素和属性的值并不重要 —— 您所关心的是结构。
还好,我还可以再次使用清单 3 中定义的测试用例来验证文档的结构,并可以有效忽略元素文本值和属性值。为实现此目的,我调用 Diff 类上的 overrideDifferenceListener() 并为它添加由 XMLUnit 提供的 IgnoreTextAndAttributeValuesDifferenceListener。修改后的测试如清单 7 所示:
清单 7. 无需属性值验证 XML 结构
public void testToXMLFormatOnly() throws Exception{
BatchDependencyXMLReport report =
new BatchDependencyXMLReport(new Date(), this.getFilters());
report.addTargetAndDependencies(
"com.acme.web.Widget", this.getDependencies());
report.addTargetAndDependencies(
"com.acme.web.Account", this.getDependencies());
Diff diff = new Diff(new FileReader(
new File("./test/conf/report-control.xml")),
new StringReader(report.toXML()));
diff.overrideDifferenceListener(
new IgnoreTextAndAttributeValuesDifferenceListener());
assertTrue("XML was not similar", diff.similar());
}