Декодированный массив circe внутри класса case всегда не проходит тест сравнения классов? - PullRequest
0 голосов
/ 10 января 2019

Для этого случая класса:

import io.circe.generic.JsonCodec

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

Этот тест проходит нормально (класс case для теста 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 для теста класса случая)

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-объекте есть много других вещей, которые я оставил в этом примере - Карты и вложенные классы дел все декодируются и могут сравниваться нормально, только когда массивы добавил, что сравнение не удается - я что-то упустил?

1 Ответ

0 голосов
/ 10 января 2019

Это скорее проблема Scala (или проблема ScalaTest), чем цирковая. Метод Scala == для массивов использует равенство ссылок, и, хотя ScalaTest shouldEqual будет работать "правильно" с массивами (т.е. будет сравнивать содержимое, а не ссылки), он все равно будет использовать == для элементов массива при сравнении двух случаев. экземпляры класса.

Существует множество способов обойти эту проблему: написав собственный Equality экземпляр для Stuff, сравнив caseClass.things shouldEqual Array("one", "two") и т. Д. Имея изменяемую коллекцию (например, Array) ) в этом случае член класса не является идиоматическим Scala и, тем не менее, почти наверняка является плохой идеей, и я настоятельно рекомендую исправить эту проблему, изменив ее на что-то вроде List или Vector.

...