0

我在 scala 中使用 junit 来比较我的 scala 代码的字符串输出。就像是 :

val expected = """<Destination id="0" type="EMAIL">
<Address>
    me@test.com
</Address>
<TimeZone>
    US/Eastern
</TimeZone>    
<Message>      
</Message>
</Destination>
"""
 val actual = getTextToLog()
 info(" actual = " + actual)
 assert(expected == actual)

问题是对于某些字符串,断言如下:

assert(expected == actual)

工作,对一些人来说,他们不串。即使我从 Eclipse 控制台复制实际(登录到 Eclipse 控制台)并将其粘贴到预期中以确保,断言仍然失败。

我错过了什么?

4

1 回答 1

2

好的,由于这是一个空白问题,您应该在比较两个字符串之前对其进行清理。例如,查看 RichString 方法.lines,它可以让您创建一个行尾或空格无关的比较方法。

这是使用隐式转换执行此操作的一种天真的方法:

import scala.language.implicitConversions
object WhiteSpace {
  implicit def strToWhiteSpace(s: String) = new WhiteSpace(s)
}

class WhiteSpace(val s: String) {
  def `~==` (other: String) = s.lines.toList == other.lines.toList
}

这使得

import WhiteSpace._
assert(expected ~== actual)

或者您可以扩展适当的 jutils 类以添加不可知的assertEquals.

请注意,此比较以相同的方式解构两个字符串。这比在往返转换中发送其中一个要安全得多。

空白/crlf 问题非常普遍,试图阻止不匹配是没有意义的;只是做不可知的比较。

于 2013-09-12T13:49:12.017 回答