scala中的数组断言

Assertion with Array in scala

我正在尝试断言条件但出现错误。

我有 Either[CaseClass[Array[String]]] 类型的结果,其值为:Right(CaseClass(Array("value")))

当我这样做时:


result should equal(Right(CaseClass(Array("value"))))


它给了我:


Right(CaseClass([Ljava.lang.String;@6ed4e733) did not equal Right(CaseClass([Ljava.lang.String;@43553bf0))

Array 不是 真正的 Scala 集合并且行为不同,例如

List(42) == List(42)    // true
Array(42) == Array(42)  // false

我们看到数组没有在结构上进行比较。现在 ScalaTest 确实为 Array 提供了特殊处理,这确实会在结构上比较它们

Array("") should equal (Array(""))            // pass

但是当 Array 嵌套在另一个容器中时它不起作用

case class Foo(a: Array[String])
Foo(Array("")) should equal (Foo(Array("")))  // fail

真正的 Scala 集合,例如 List,不会遇到这个问题

case class Bar(a: List[String])
Bar(List("")) should equal (Bar(List("")))    // pass

有一个未解决的问题 Matchers fail to understand Array equality for Arrays wrapped inside a container/collection #491 来解决 Array 的深度相等性检查,但是现在我建议切换到 List 而不是 Array。另一种选择是提供您自己的自定义相等性,旨在处理您的特定情况。