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