比较Groovy / Java中的两个XML字符串/文件

我正在编写unit testing来检查一些XML构建器。

现在我遇到了预期结果和实际结果之间的语法差异问题,尽管它们的语义相同。

例:

预期结果:

text here 

实际结果:

   text here   

我尝试使用XmlUtil.serialize()来规范化xml,但这似乎保留了空白,留下了语法上的差异。

我怎样才能获得xml字符串的规范化/规范forms,以使我的测试更加健壮?

我正在编写一个Grails应用程序,所以我对Groovy或Java中的任何解决方案都没问题。

您可以像这样使用Groovy XMLUnit实用程序:

 XMLUnit.setIgnoreWhitespace(true) XMLUnit.setIgnoreComments(true) XMLUnit.setIgnoreDiffBetweenTextAndCDATA(true) XMLUnit.setNormalizeWhitespace(true) XMLUnit.compareXML(expectedXml, actualXml) 

比较XML文件而忽略语法差异。

问题和接受的答案(截至今天)对应于XMLUnit的遗留版本。

对于那些有兴趣知道如何在Groovy上使用XMLUnit v2进行操作的人:

 def "XMLs must be identical"() { setup: def control = '' def test = '''    ''' when: Diff d = DiffBuilder.compare(Input.fromString(control)) .withTest(Input.fromString(test)) .ignoreWhitespace() .ignoreComments() .normalizeWhitespace() .build() then: !d.hasDifferences() } 

也许有一种“更加时髦”的方式,但我觉得它可以用于插图目的:)

较老的问题,但可能有趣,以备将来使用。
另一种可能性,不仅适用于XML,还可以用于您的问题。

对于这样的测试,您还可以使用ApprovalTests( http://approvaltests.sourceforge.net ),这会导致unit testing中的代码非常少。

使用ApprovalTests,您可以编写测试并使用预期输出检查输出。

简短说明:在测试的第一次运行中,没有预期的输出,因此ApprovalTests写入两个文件 – “已接收”(代码输出)和“已批准”(代码的预期输出)。 在第一次运行中,“已批准”为空,因为您必须批准代码的输出。 这是通过diff工具完成的。 ApprovalTests打开diff工具并显示其中的两个文件。 如果代码的输出符合预期,则将输出移动到批准的文件。 现在,如果输出没有改变(接收==已批准),则所有后续测试运行都将通过。