我在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控制台)并将其粘贴到预期中以确保,断言仍然失败。
我错过了什么?
答案 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问题非常普遍,试图阻止不匹配就没有必要与之作斗争;只做不可知的比较。