首页 > 解决方案 > 如何在模拟中通过 Scala 类

问题描述

我有一个 scala 类 A,其中有一个方法doSomething

还有一个B类

  class B(name: String)

还有一个C类

class C {
 def doSomethingElse(b: B): String { 
 /// some logic 

 ////

 }
} 


 class A(c: C) {
  def doSomething(uuid: UUID): String {
   val b = new B("hello)
   c.doSomethingElse(b)
   // some logic

 }

}

现在我想doSomething使用 scalatest 和 scalamock 测试 A 类的方法

我试图模拟通话doSomethingElse

val mockC = mock[C] 
val b = new B("hello")
(mockC.doSomethingElse _).expects(b).returning("A");

但是当实际调用发生时,模拟不会得到满足,因为对象B不同。有没有办法表达这个模拟,让它得到满足?

标签: scalascalatestscalamock

解决方案


Thilo 的评论是正确的 - 您的两个Bs 将作为上面的引用进行比较,并且由于它们不是同一个对象,因此它们不相等。对于内容平等,您需要适当的equals实现。如果你制作 B a ,你可以在 Scala 中免费获得它case class。如果您无法更改 B 类,那么在 ScalaMock 中使用谓词数学可能会帮助您在测试期间比较两个实例。在这里阅读:https ://scalamock.org/user-guide/matching/


推荐阅读