Scala case class 的相等性在包含内部数组时在 junit assertEquals 中不起作用
Equality of Scala case class does not work in junit assertEquals when it contains an inner Array
我在 Scala 中有一个
case class foo(a: Array[String], b: Map[String,Any])
我正在尝试对此进行 运行 单元测试,但 assertEquals
同时将 foo 元素(实际和预期)存储在数组中。
所以最后一行使用 assertEquals(expected.deep, actual.deep)
.
地图 b 显示正确,但 assertEquals 正在尝试匹配数组 a 的哈希码而不是内容。错误是 get 是这样的:
Array(foo([Ljava.lang.string@235543a70,Map("bar" -> "bar")))
整体代码看起来像
case class Foo(a: Array[String], b: Map[String, Any])
val foo = Foo(Array("1"), Map("ss" -> 1))
val foo2 = Foo(Array("1"), Map("ss" -> 1))
org.junit.Assert.assertEquals(Array(foo).deep, Array(foo2).deep)
你建议如何进行这项工作?
Scala 中的案例 classes 带有它们自己的 hashCode
和 equals
方法,不应被覆盖。此实现检查内容的相等性。但它依赖于 "content" 基于 hashCode
和 equals
案例 class 中使用的类型的实现。
不幸的是,Arrays
不是这种情况,这意味着无法使用默认的 equals
方法按内容检查数组。
最简单的解决方案是使用根据内容检查相等性的数据集合,例如 Seq
。
case class Foo(a: Seq[String], b: Map[String, Any])
val foo = Foo(Seq("1"), Map("ss" -> 1))
val foo2 = Foo(Seq("1"), Map("ss" -> 1))
org.junit.Assert.assertEquals(foo, foo2)
在这种情况下调用 deep
对您没有帮助,因为它仅扫描和转换嵌套的 Array
。
println(Array(foo, Array("should be converted and printed")))
println(Array(foo, Array("should be converted and printed")).deep)
产生
[Ljava.lang.Object;@188715b5
Array(Foo([Ljava.lang.String;@6eda5c9,Map(ss -> 1)), Array(should be converted and printed))
我在 Scala 中有一个
case class foo(a: Array[String], b: Map[String,Any])
我正在尝试对此进行 运行 单元测试,但 assertEquals
同时将 foo 元素(实际和预期)存储在数组中。
所以最后一行使用 assertEquals(expected.deep, actual.deep)
.
地图 b 显示正确,但 assertEquals 正在尝试匹配数组 a 的哈希码而不是内容。错误是 get 是这样的:
Array(foo([Ljava.lang.string@235543a70,Map("bar" -> "bar")))
整体代码看起来像
case class Foo(a: Array[String], b: Map[String, Any])
val foo = Foo(Array("1"), Map("ss" -> 1))
val foo2 = Foo(Array("1"), Map("ss" -> 1))
org.junit.Assert.assertEquals(Array(foo).deep, Array(foo2).deep)
你建议如何进行这项工作?
Scala 中的案例 classes 带有它们自己的 hashCode
和 equals
方法,不应被覆盖。此实现检查内容的相等性。但它依赖于 "content" 基于 hashCode
和 equals
案例 class 中使用的类型的实现。
不幸的是,Arrays
不是这种情况,这意味着无法使用默认的 equals
方法按内容检查数组。
最简单的解决方案是使用根据内容检查相等性的数据集合,例如 Seq
。
case class Foo(a: Seq[String], b: Map[String, Any])
val foo = Foo(Seq("1"), Map("ss" -> 1))
val foo2 = Foo(Seq("1"), Map("ss" -> 1))
org.junit.Assert.assertEquals(foo, foo2)
在这种情况下调用 deep
对您没有帮助,因为它仅扫描和转换嵌套的 Array
。
println(Array(foo, Array("should be converted and printed")))
println(Array(foo, Array("should be converted and printed")).deep)
产生
[Ljava.lang.Object;@188715b5
Array(Foo([Ljava.lang.String;@6eda5c9,Map(ss -> 1)), Array(should be converted and printed))