如何在模拟中传递scala类

如何在模拟中传递scala类,scala,scalatest,scalamock,Scala,Scalatest,Scalamock,我有一个scala类,其中有一个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.doSomethingEl

我有一个scala类,其中有一个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

 }

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

我试着去嘲笑doSomethingElse的电话


但是当实际调用发生时,mock不会得到满足,因为B的对象不同。有没有一种方法来表达这个模拟,使它得到满足?

Thilo的评论是正确的-你的两个B将作为上面的参考进行比较,因为它们不是同一个对象,所以它们不相等。为了实现内容平等,您需要一个适当的equals实现。如果你让B成为一个案例类,你可以在Scala中免费得到它。如果您不能更改类B,那么在ScalaMock中使用谓词mather可能会帮助您在测试期间比较这两个实例。请在此阅读:

以下是@Thilo和@PhilippM建议的示例:

像这样重写equals方法

class B(val name: String) {
  override def equals(obj: Any): Boolean = obj match {
    case b: B => b.name == this.name
    case _ => false
  }
}
我们可以用普通的

(mockC.doSomethingElse _) expects(new B("hello")) returning("A")
或者如果我们不能修改B,那么就这样尝试


如果您希望新的Bhello被视为等同于另一个新的Bhello,那么您必须相应地实现.equals。默认情况下,仅当同一实例相等时才使用Java实例标识。如果B可以是一个case类,你可以免费得到它。但是我的不是case类,它不一定只是为了让测试通过。是否有任何其他技巧只能用于测试?您是否已经阅读并尝试了谓词匹配器,正如我上面建议的那样?如果这对您不起作用,那么就没有办法,从根本上说,这就是JVM的工作方式。
(mockC.doSomethingElse _) expects(new B("hello")) returning("A")
mockC.doSomethingElse _ expects where { (b: B) => b.name == new B("hello").name } returning "A"