scala triple引用字符串的不可预知的行为

时间:2013-09-12 12:50:39

标签: string scala junit

我在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控制台)并将其粘贴到预期中以确保,断言仍然失败。

我错过了什么?

1 个答案:

答案 0 :(得分:2)

好的,因为这是一个空白问题,你应该在比较它们之前清理这两个字符串。例如,查看像.lines这样的RichString方法,它们可以让您创建一个行结束或与空白无关的比较方法。

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

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问题非常普遍,试图阻止不匹配就没有必要与之作斗争;只做不可知的比较。