我的应用程序的这一部分从 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 添加更多属性或注释?或者我唯一能做的就是修改我的反射检查以深入了解向量?理想情况下,我不想修改单元测试。
谢谢!