带有数组的案例类的标量assertEquals

问题描述 投票:0回答:1

我在斯卡拉case class foo(a: Array[String], b: Map[String,Any])我正在尝试为此进行单元测试,但在将foo元素(实际和预期)存储在数组中时,却需要执行assertEquals。因此,最后一行使用的是assertEquals(expected.deep, actual.deep)

映射b正确显示,但是assertEquals尝试匹配Array a的哈希码而不是内容。错误是得到是这样的: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 class junit case equals
1个回答
0
投票

scala中的案例类带有其自己的hashCodeequals方法,不应覆盖它们。这些实现检查内容的相等性。但它依赖于case类中使用的基于“内容”的hashCodeequals实现类型。

[不幸的是,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不会帮助您,因为一旦找到案例类,它就不会更深入。

© www.soinside.com 2019 - 2024. All rights reserved.