gpt4 book ai didi

scala - 案例类中的解码圆数组总是无法通过案例类比较测试?

转载 作者:行者123 更新时间:2023-12-05 00:46:26 24 4
gpt4 key购买 nike

对于这个案例类:

import io.circe.generic.JsonCodec

@JsonCodec
case class Stuff(things: Array[String])

这个测试通过了(案例类到 json 测试):
import io.circe.parser.decode
import io.circe.syntax._
import org.scalatest._

val caseClass = Stuff(things = Array("one", "two"))

val json = caseClass.asJson.spaces2

json shouldEqual
"""{
| "things" : [
| "one",
| "two"
| ]
|}""".stripMargin

但是,这是失败的(json to case class test)
import io.circe.parser.decode
import io.circe.syntax._
import org.scalatest._

val json =
"""{
| "things" : [
| "one",
| "two"
| ]
|}""".stripMargin

val caseClass = Right(decode[Stuff](json))

caseClass shouldEqual Stuff(things = Array("one", "two"))

在调试器中逐步执行它,似乎数组没有像我预期的那样被解码,它似乎是对象标识/内存地址,它总是不同的,所以我的测试失败了:

[Ljava.lang.String;@2fa7ae9

请注意,这似乎只发生在数组上,我的 json blob 中还有很多东西我在这个例子中遗漏了 - map 和嵌套的案例类都被解码并且可以进行比较,只有当添加了数组时,比较失败 - 我错过了什么吗?

最佳答案

这更像是一个 Scala 问题(或一个 ScalaTest 问题)而不是一个圈子问题。斯卡拉的 ==数组上的方法使用引用相等,而 ScalaTest 的 shouldEqual将在数组上“正确”工作(即它会比较内容而不是引用),它仍然会使用 ==用于比较两个 case 类实例时的数组成员。

有很多方法可以解决这个问题:通过编写自己的 Equality instanceStuff , 通过比较 caseClass.things shouldEqual Array("one", "two")等。将可变集合(如 Array )作为 case 类成员不是惯用的 Scala 并且几乎肯定是一个坏主意,但我强烈建议通过将其更改为类似 List 的内容来解决此问题。或 Vector .

关于scala - 案例类中的解码圆数组总是无法通过案例类比较测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54129762/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com