【发布时间】:2020-12-07 04:33:29
【问题描述】:
在单元测试中将一个Map[String, Int] 断言给另一个我得到:
Map(bar -> 114, foo -> 5) did not equal Map("foo" -> 5, "bar" -> 114)
请注意,键不是在左侧引用,而是在右侧引用。
左边通过 Avro 序列化作为 GenericRecord 的一部分在 Kafka 中往返。右边是我这样构建的测试夹具:
program_int_args = Map[String, Int]("foo" -> 5, "bar" -> 114)
一旦我从 Kafka 取回它,我就会像这样解码 Avro 消息:
val program_int_args_ =
record.get("program_int_args")
.asInstanceOf[java.util.Map[String, Integer]]
.asScala
.toMap[String, Integer]
.mapValues(Integer2int(_))
问题:
- 为什么来自 GenericRecord 后没有引号?
- 为什么会出现构建地图中的引号?
- 我怎样才能使它们相等?
根据 Thomas Klager 的评论,我检查了键的类,确实它们是不同的:
class org.apache.avro.util.Utf8 did not equal class java.lang.String
所以更新问题:
Utf8 类型如何成为 Map[String, Int] 中的键,但不等于 String 中的相同数据?
【问题讨论】:
-
我怀疑其中一张地图(从 avro 返回的地图)没有字符串作为键。您可以添加一个断言来验证或反驳这一点:
assertEquals(program_int_args.head._1.getClass, program_int_args_.head._1.getClass) -
“Utf8 类型如何成为 Map[String, Int] 中的键” 因为它可能不是。试试这个:
val aKey = program_int_args_.keySet.head然后aKey.split(',')它应该抛出一个无效的转换异常,然后罪魁祸首将是.asInstanceOf[java.util.Map[String, Integer]]这就是为什么类转换是不安全的,特别是由于擦除。