Scala Mock Syntax (class _).expects 是什么意思?

Scala Mock Syntax (class _).expects meaning?

Scala 新手,已广泛搜索以澄清某些 ScalaMock 语法。根据 this guide,我一直看到以下一般测试模式:

(myClass.myMethod _).expects()

这里究竟发生了什么? class/method/space/underscore 有什么作用?编译器如何处理这个?

附加的_强制将方法转换为函数。

为了理解为什么这是必要的,让我们尝试重新构建一小块 Scalamock,即 expects 方法。 expects 方法似乎是在模拟对象的方法上调用的。但是方法/函数没有 expects 方法开头。因此,我们必须使用 "pimp my library" 模式将方法 expects 附加到函数。我们可以这样做:

implicit class ExpectsOp[A, B](f: A => B) {
  def expects(a: A): Unit = println("it compiles, ship it...")
}

现在让我们用方法 baz:

定义一个 class Bar
class Bar {
  def baz(i: Int): Int = i * i
}

还有一个 Bar 的实例:

val bar = new Bar

让我们看看如果您尝试在 bar.baz 上调用 expects 会发生什么:

(bar.baz).expects(42)

error: missing argument list for method baz in class Bar Unapplied methods are only converted to functions when a function type is expected. You can make this conversion explicit by writing baz _ or baz(_) instead of baz.

因此,如果不显式转换为函数,它就无法工作,我们必须通过附加 _:

来强制执行此转换
(bar.baz _).expects(42) // prints: "it compiles, ship it..."