如何解决Scala 测试问题
我是 Scala 的新手,使用 Scala 测试和喷雾 json 编写测试用例。我的代码如下:
case class MyModel(Point1: String,Point2: String,Point3: Option[NewModel] = None)
case class NewModel(Point4: Boolean,Point5: Boolean,Point6: Boolean)
it should "serialise/deserialize a MyModel to JSON" in {
val json= """{"Point1":"","Point3":[],"Point2":""}""".parseJson
val myModelViaJson= json.convertTo[MyModel]
myModelViaJson.Point1 shouldBe ""
myModelViaJson.Point3.head.point4 shouldBe true
myModelViaJson.Point2 shouldBe ""
}
我在运行测试用例时遇到以下错误
should serialise/deserialize a MyModel to JSON *** Failed ***
[info] spray.json.DeserializationException: Object expected in field 'point4'
[info] at spray.json.package$.deserializationError(package.scala:23)
[info] at spray.json.ProductFormats.fromField(ProductFormats.scala:63)
[info] at spray.json.ProductFormats.fromField$(ProductFormats.scala:51)
如何解决这个问题?
解决方法
您的 JSON 将 Point3
的值设置为 []
,这是一个空数组,但在 Scala 中它应该是一个 NewModel
对象(因此“预期对象”)。>
在 Option
中使用 MyModel
表示 JSON 中可能缺少该字段,在这种情况下,提取的值将是 None
。如果 JSON 中存在 Point3
字段,则它应包含 NewModel
的 JSON,然后该字段将为 Some(<NewModel instance>)
。
只是为了详细说明@Tim 的正确答案。提供的 Json 与模型之间存在不兼容。 json 有 Point3
作为数组,而在 MyModel
中它是 Option[NewModel]
。因此,第一个不能反序列化为后者。解决的方法有很多,看你想要什么了。
-
最简单的方法,从 Json 中删除
Point3
:val json= """{"Point1":"","Point2":""}""".parseJson val myModelViaJson= json.convertTo[MyModel]
它将产生
MyModel(,None)
-
将 Json 更改为
NewModel
:val json= """{"Point1":"","Point3":{ "Point4": true,"Point5": true,"Point6": true },"Point2":""}""".parseJson val myModelViaJson= json.convertTo[MyModel]
产生
MyModel(,Some(NewModel(true,true,true)))
-
如果你真的想在那里有数组,你可以改变
MyModel
类:case class MyModel(Point1: String,Point2: String,Point3: Option[Seq[NewModel]] = None)
然后是:
val json= """{"Point1":"","Point3":[],"Point2":""}""".parseJson val myModelViaJson= json.convertTo[MyModel]
产生:
MyModel(,Some(List()))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。