当前位置: 首页 > 知识库问答 >
问题:

Scala测试匹配某个字段上的case类

罗源
2023-03-14
case class Foo(field1: String, field2: String, field3: String)

expected: Seq[Foo] = Seq(...)

result: Seq[Foo] = Seq(...)

示例:

val expected = Seq(
  Foo(
    "f1", "f2", "f3"
  )
)

val result = Seq(
  Foo(
    "fx", "f2", "f3"
  )
)

这两个序列必须匹配。

  result should matchWithoutId(expected)

共有1个答案

陈宏胜
2023-03-14

文档在使用自定义匹配器中,这个示例将是(例如)

def matchWithoutId(expected: Foo): Matcher[Foo] = Matcher { actual =>
  MatchResult(
    actual.field2 == expected.field2 && actual.field3 == expected.field3,
    if (actual.field2 != expected.field2)
      s"field2 of $actual was not equal to that of $expected"
    else
      s"field3 of $actual was not equal to that of $expected",
    s"field2 and field3 of $actual were equal to those of $expected")
}

根据口味调整错误消息。

或者另一种方法(在这种情况下可能是更好的方法):

def matchWithoutId(expected: Foo): Matcher[Foo] = have(
  'field2 (expected.field2),
  'field3 (expected.field3)
)
 类似资料:
  • 我看到过一些关于的博客,这些博客似乎可以很好地为类添加行为。 但是,如果我有一个并且我要怎么办?作为一个case类,我不能扩展它(不推荐/强烈不鼓励从case类继承)。这些皮条客模式是否允许我将数据添加到case类中?

  • 本文向大家介绍Scala序列上的模式匹配,包括了Scala序列上的模式匹配的使用技巧和注意事项,需要的朋友参考一下 示例 检查集合中元素的准确数量 现场演示 提取first(s) element(s)并将其余部分保留为集合: 通常,可以用于构建序列的任何形式都可以用于与现有序列进行模式匹配。 请注意,在使用Nil和::在对序列进行模式匹配时将起作用,但确实会将其转换为List,并且可能会产生意外结

  • 在阶段,我希望创建一个虚拟(布尔)字段,该字段如下: null 以下是我所尝试的: 此操作失败,原因是和消息。我在这里找到了问题,但这个用例略有不同,答案不是很容易理解。

  • 我想消除此示例代码中的类型擦除警告: 它编译和工作正常,但有一个警告: 警告:(31,13)类型模式Seq[Int](Seq[Int]的底层)中的非变量类型参数Int未选中,因为它被擦除情况b消除:Seq[Int]= 在这种情况下,你有什么简单的解决方案来避免擦除吗? 到目前为止,我尝试了什么(根据这一点): 但是它不能编译,因为c现在是Any类型。 我相信这个问题有几种解决方法。我会接受最简单的

  • 我对Scala很陌生,请耐心等待。我有一堆包裹在一个大数组中的期货。期货已经完成了他们的辛勤工作,查看了一些TB的数据,在我的应用程序结束时,我想总结所有的结果,这样我就可以很好地展示它们。 我拥有的期货集合属于以下类型: 到目前为止,我读到的所有关于理解的东西都表明 导致 按照同样的逻辑,我的意图是这样做,因为我最近发现选项,尝试,失败和成功可以被视为集合: 但这不一定行得通。我似乎收到了以下编

  • 我只看到两种方法: 将所有字段设置为受保护(或包可见性) 为所有字段生成50个getter 创建50个委托方法来获取这些字段的状态,而不是整个对象的状态 在正常情况下,我会选择最后一个(尽管我真的不想仅仅出于测试的原因而改变界面)。但是在我的类中编写50个新方法只是为了测试真的有意义吗?在这种情况下,将字段设置为受保护的不是更好吗,因为有这么多方法,类会变得不清楚? 注意。反射是我想使用的最后一个