0

我的应用程序的这一部分从 JSON 解析到我的对象。我创建了一个单元测试,它创建了一个“PurchaseOrder”,将其转换为 JSON 并将其转换回相同类型的对象,并使用反射来检查原始的 PurchaseOrder 和最终的 PurchaseOrder 是否相同:

val purchaseOrderJson = PurchaseOrderJson.toJson(purchaseOrder)
val clientPurchaseOrder = PurchaseOrderJson.fromJson(purchaseOrderJson)

val reflectionCheck = classOf[PurchaseOrder].getMethods.forall {
 (method: Method) =>
    if (!method.invoke(purchaseOrder).equals(method.invoke(clientPurchaseOrder))) {
      println("%s unequal: %s vs %s".format(method.getName, method.invoke(purchaseOrder), method.invoke(clientPurchaseOrder)))
      false
    } else {
      true
    }
}

这是 JSON:

"purchaseOrders": [{
    "id": "522423",
    "lineItems": [{
        "notes": "Important item",
        "origin": "Spain"
      },{
        "notes":null,
        "origin": "Italy"
    }]
}]

我将对象定义为特征:

trait PurchaseOrder {
  def id: String
  def lineItems: Vector[LineItem]
}

trait LineItem {
  def notes: Option[String]
  def origin: String
}

并且实现如下:

class PurchaseOrderJson(
    @(JsonProperty @field) override val id: String,
    @(JsonProperty @field) override val lineItems: Vector[LineItemImpl]
) extends PurchaseOrder {
    def this() = this("",Vector.empty[LineItemImpl])
}

case class LineItemImpl(notes: Option[String]) extends LineItem

现在:) 我的问题是我必须向 LineItem 添加很多字段,编译器抱怨我在一个案例类中不能有超过 22 个参数。所以我所做的就是将 LineItemImpl 重写为如下所示:

class LineItemImpl(
    @(JsonProperty @field) override val notes: Option[String] = None
) extends LineItem {
    def this() = this(None)
}

但现在我的反射单元测试出现错误:

lineItems unequal: Vector(com.giltgroupe.purchaseorder.core.json.LineItemImpl@5b6ca395) vs Vector(com.giltgroupe.purchaseorder.core.json.LineItemImpl@3967ba17)

这意味着被比较的两个对象中的两个向量在内部元素上有所不同。我理解这是因为当我将案例类更改为标准类时,它会丢失一些模式匹配属性,所以现在它比较的是对象地址而不是内容。

有没有办法解决这个问题,向 LineItemImpl 添加更多属性或注释?或者我唯一能做的就是修改我的反射检查以深入了解向量?理想情况下,我不想修改单元测试。

谢谢!

4

1 回答 1

1

我发现我缺少一个为案例类自动创建的方法,等于

 override final def equals (other:Any):Boolean = {}

在这种情况下,我还需要定义 hashCode 方法,这不是我的代码运行所必需的,但如果不包括在内,它可能会在未来产生奇怪的行为:

override final def hashCode(): Int = ScalaRunTime.this._hashCode(LineItemJson.this)
于 2012-11-05T18:40:53.960 回答