Scala模拟语法(类3;)。需要什么意思?

Scala模拟语法(类3;)。需要什么意思?,scala,unit-testing,mocking,scalamock,Scala,Unit Testing,Mocking,Scalamock,对于Scala来说,我们是新手,已经搜索了很多关于ScalaMock语法的解释。根据,我一直看到以下一般测试模式: (myClass.myMethod)。expects() 这里到底发生了什么?类/方法/空格/下划线的作用是什么?编译器是如何处理这个问题的?附加的.强制将方法转换为函数 为了理解为什么这是必要的,让我们尝试重新构建一小块Scalamock,即expects方法。预期方法似乎是在模拟对象的方法上调用的。但是方法/函数没有期望的方法。因此,我们必须使用“pimp my library

对于Scala来说,我们是新手,已经搜索了很多关于ScalaMock语法的解释。根据,我一直看到以下一般测试模式:

(myClass.myMethod)。expects()


这里到底发生了什么?类/方法/空格/下划线的作用是什么?编译器是如何处理这个问题的?

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

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

implicit class ExpectsOp[A, B](f: A => B) {
  def expects(a: A): Unit = println("it compiles, ship it...")
}
现在,让我们用方法
baz
定义一个类
Bar

class Bar {
  def baz(i: Int): Int = i * i
}
(bar.baz).expects(42)
也是
条的一个实例

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

class Bar {
  def baz(i: Int): Int = i * i
}
(bar.baz).expects(42)
错误:类栏中缺少方法baz的参数列表 未应用的方法仅在需要函数类型时才会转换为函数。您可以通过编写
baz
baz(
)而不是
baz
来明确此转换

因此,如果没有显式转换为函数,它将无法工作,我们必须通过附加
\uuu

(bar.baz _).expects(42) // prints: "it compiles, ship it..."

非常感谢你!这正好回答了我的问题。