比较单元测试中的scala.xml.Elem对象

我有两个scala.xml.Elem对象(实际的,预期的)。我使用的是JUnit4,但也包括了XMLUnit1.3

有没有简单的方法来比较这两个对象是否相等,忽略XML中的属性顺序和不重要的空格

我尝试了XMLUnit.assertXMLEqual(),但它抱怨类型是scala.xml.Elem

我知道我可以使用equals==,但我希望在两个值不相等时使用断言打印这两个值。如果我使用assertTrue(实际的.equals(预期的)),并且它们不相等,那么唯一的输出将是“assertion failed”

如果要与忽略空白的XMLElem对象进行比较,可以使用scala.XML.Utility.trim方法从中删除空白

scala>val a=<foo>酒吧&lt/foo>
a:scala.xml.Elem=<foo>酒吧&lt/foo>
scala>val b=<foo>酒吧&lt/foo>
b:scala.xml.Elem=<foo>酒吧&lt/foo>
scala>a==b
res8:Boolean=false
scala>导入scala.xml.Utility.trim
导入scala.xml.Utility.trim
scala>修剪(a)==修剪(b)
res9:Boolean=true

如果使用XML文本,Scala不关心属性的顺序:

scala>val a=<foo first=“1”second=“2”/>
a:scala.xml.Elem=<foo first=“1”second=“2”&gt&lt/foo>
scala>val b=<foo second=“1”first=“1”/>
b:scala.xml.Elem=<foo first=“1”second=“1”&gt&lt/foo>
scala>a==b
res22:Boolean=true

我建议对单元测试使用ScalaTest,因为您有ShouldMatchers

//Scala repl在类路径中以scalatest-1.2.jar启动
scala>val a=<foo>酒吧&lt/foo>
a:scala.xml.Elem=<foo>酒吧&lt/foo>
scala>val b=<foo>酒吧&lt/foo>
b:scala.xml.Elem=<foo>酒吧&lt/foo>
scala>a应等于(b)
scala>val b=<foo>bar2&lt/foo>
b:scala.xml.Elem=<foo>bar2&lt/foo>
scala>a应等于(b)
org.scalatest.TestFailedException:<foo>酒吧&lt/foo>不等于<foo>bar2&lt/foo>
在org.scalatest.matchers.matchers$class.newTestFailedException上(matchers.scala:148)
在org.scalatest.matchers.ShouldMatchers$.newTestFailedException上(ShouldMatchers.scala:2329)
位于org.scalatest.matchers.ShouldMatchers$ShouldMethodHelper$.shouldMatcher(ShouldMatchers.scala:871)
位于org.scalatest.matchers.ShouldMatchers$SeqShouldWrapper.should(ShouldMatchers.scala:1724)
at<初始化>(<控制台>:15)
at<clinit>(<控制台>)
在请求时结果$<初始化>(<控制台>:9)
在请求时结果$<clinit>(<控制台>)
请求时结果$scala\u repl\u结果(<console>)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在阳光下。反射。德莱加。。。

发表评论